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

[Dúvida] Dúvida sobre erro no insertion sort

Boa noite! Estou testando a forma do Insertion Sort sugerida no final da atividade 04 da aula 03 que foi mudar a let atual de 0 para 1 e retirar a condição adicional do While. Porém meu código não funciona e o terminal apresenta o erro de não conseguir ler propriedades de "undefined", mas no teste de mesa a posição da array é 1-1, o que na teoria não deve dar erro... Alguém sabe o que está acontecendo?

const livros = require('./algoritmoOrdenacao2') // Só mudei o nome do arquivo.js mas ele pega a lista de livros com "titulo" e "preco"

function insertionSort (lista){

    for (let atual = 1; atual < lista.length; atual ++){
        let analise = atual;
        while (lista[analise].preco < lista[analise-1].preco){
            let itemAnalise = lista[analise];

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

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

insertionSort(livros)

Da forma anterior funciona sem problemas:

    for (let atual = 0; atual < lista.length; atual ++){
        let analise = atual;
        while (analise > 0 && lista[analise].preco < lista[analise-1].preco){
4 respostas

Oi Marcos,

o problema está em retirar a condição 'analise > 0' do while interno. Nesse algoritmo, toda vez que vc avançar uma vez no array, logo em seguida vc precisa olhar todas as posições anteriores. Como vc tirou essa condição, logo na segunda passagem do while loop, vc tem que 'analise = -1', só que o array não tem posição -1, então ele vai dar um erro de acesso indevido pq vc está tentando buscar um valor fora do array.

Oi Gil! Obrigado por responder.

Mas nessa alteração a variável análise recebe o valor inicial como 1, no teste de mesa fica assim:

atual = 1 analise = 1 analise - 1 = 0

solução!

Sim, mas com a retirada da condição no while, ele não sabe que tem que parar quando analise == 0. Então se a condição que vc deixou 'while (lista[analise].preco < lista[analise-1].preco)' ainda estiver verdadeira, o programa irá tentar fazer mais um loop, onde analise = 0, ai vai chegar no final e analise-- faz analise = -1. Quando o programa tenta repetir o while mais uma vez, ele não vai conseguir acessar lista[-1]. Essa é uma posição inválida no array. Então ele quebra.

Compreendi! Agora funcionou, editei a linha 13 onde tem o analise-- e deu certo! Muito obrigado!