Boa noite pessoal, fiz um algoritmo de bubble sort e gostaria de compartilhar:
const livros = [
{
nome: "JavaScript",
preco: 25
},
{
nome: "PHP",
preco: 15
},
{
nome: "Java",
preco: 30
},
{
nome: "Elixir",
preco: 50
},
{
nome: "Go",
preco: 45
},
{
nome: "Python",
preco: 20
}
];
function bubbleSort(lista) {
let copia;
let troca;
do {
troca = 0;
for (let i = 0; i < lista.length - 1; i++) {
if (lista[i].preco > lista[i + 1].preco) {
copia = lista[i];
lista[i] = lista [i + 1];
lista[i + 1] = copia;
troca = 1;
}
}
} while (troca)
console.log(lista);
}
bubbleSort(livros); // chamada da função passando a array livros como argumento
Esse algoritmo irá retornar a array de objetos livros ordenada.
Neste caso usei duas variáveis para fazer o processo uma copia que recebe uma cópia para salvar o dado que será trocado, uma analogia que eu gosto de pensar é: você tem dois baldes cheios, um de pedras e um com areia, e você (por algum motivo maluco que não importa para a analogia) precisa trocar esses conteúdos de um balde pra outro, você não vai jogar as pedras ou a areia no chão para passar o conteúdo de um balde para o outro e depois recolher o conteúdo do chão, então você precisa de um TERCEIRO balde, que é a variável copia, então fazemos o seguinte:
- Passamos o conteúdo do balde de pedras para o balde copia vazio;
- Passamos o conteúdo do balde de areia para o balde vazio que continha as pedras;
- Passamos as pedras no balde copia para o balde vazio que continha areia;
- Trocamos os dados de lugar sem perdê-los.
A outra variável chamada troca serve como estrutura de controle para o loop do... while, sempre que houver uma troca, ela é mudada para 1 para que o loop aconteça novamente e ela é mudada para 0 antes do próximo loop for, sendo assim, caso nenhuma troca de valores aconteça, o loop acaba e a lista estará ordenada.
Obs.: O ponto de parada é definido como i < lista.length - 1 pois, caso fôssemos até o final da array compararíamos o último valor com um valor i + 1 que não existe na array, podendo acarretar problemas no código.
Obs. 2: Podemos realizar este mesmo procedimento com dois loops for aninhados, mas esta forma de fazer o algoritmo é mais ineficiente, pois mesmo que a lista já esteja ordenada, o loop será realizado até a condição de parada, ou seja, em um vetor de 6 elementos (como é o caso) ele irá percorrer o array 30 vezes.
//6
for (let i = 0; i < lista.length; i++) {
//5
for (let j = 0; j < lista.length - 1; j++) {
// código
}
}