Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Array não volta ordenada por preço

const livros = require("./listaLivros");

function insertionSort(lista){
    for(let atual = 0; atual < livros.length; atual++){
        let analise = atual;
        while(analise > 0 && lista[analise].preco < lista[analise - 1].preco){
                let itemAnalise = lista[analise];
                let itemAnterior = lista[analise - 1]

                lista[analise] = itemAnterior;
                lista[analise - 1] = itemAnalise;
        }
    }
    console.log(lista);
}

insertionSort(livros)

E esse é o terminal depois de executar a função. Era pra voltar ordenada por preço.

[
  { titulo: 'PHP', preco: 15 },
  { titulo: 'JavaScript', preco: 25 },
  { titulo: 'Java', preco: 30 },
  { titulo: 'Go', preco: 45 },
  { titulo: 'Python', preco: 20 },
  { titulo: 'Elixir', preco: 50 }
]
2 respostas
solução!

Olá Vinícius! Tudo bem?

Pelo que eu pude perceber, o seu código está quase certo. O problema está na condição do seu while. Quando você compara lista[analise].preco < lista[analise - 1].preco, você está comparando o preço do livro atual com o preço do livro anterior. Porém, você não está atualizando o valor de analise dentro do while, o que faz com que ele fique preso em um loop infinito.

Para corrigir isso, basta adicionar analise-- dentro do while, para que ele possa comparar o livro atual com todos os livros anteriores. Ficaria assim:

function insertionSort(lista){
while(analise > 0 && lista[analise].preco < lista[analise - 1].preco){
    let itemAnalise = lista[analise];
    let itemAnterior = lista[analise - 1]

    lista[analise] = itemAnterior;
    lista[analise - 1] = itemAnalise;

    analise--;
}
}
console.log(lista)
}

insertionSort(livros)

Espero ter ajudado e bons estudos!

Nem me dei conta disso, obrigado pela ajuda :)