1
resposta

Resultado inesperado

Olá, meu código apresenta o seguinte problema: Ao invés de retornar o array completamente ordenado, apenas retorna pares ordenados. Alguém pode me ajudar?

meu código:

const listaLivros = require('./listaLivros');

function mergeSort(lista) {

    if (lista.length > 1) {
        const meio = Math.floor(lista.length/2);
        const parte1 =  mergeSort(lista.slice(0, meio));
        const parte2 = mergeSort(lista.slice(meio, lista.length));
        lista = ordena(parte1, parte2)
    }
    return lista
}

function ordena(parte1, parte2) {

    let posicaoAtualParte1 = 0;
    let posicaoAtualParte2 = 0;
    const resultado =[];

    while (posicaoAtualParte1 < parte1.length && posicaoAtualParte2 < parte2.length) {
        let itemAtualParte1 = parte1[posicaoAtualParte1];
        let itemAtualParte2 = parte2[posicaoAtualParte2];

        if (itemAtualParte1.preco < itemAtualParte1.preco) {
            resultado.push(itemAtualParte1);
            posicaoAtualParte1++
        } else {
            resultado.push(itemAtualParte2);
            posicaoAtualParte2++
        }
    }

    return resultado.concat(posicaoAtualParte1 < parte1.length 
        ? parte1.slice(posicaoAtualParte1)
        : parte2.slice(posicaoAtualParte2))
}

console.log(mergeSort(listaLivros))

o retorno no console:

[
  { nome: 'Python', preco: 20 },
  { nome: 'C#', preco: 33 },
  { nome: 'JavaScript', preco: 25 },
  { nome: 'Ruby', preco: 28 },
  { nome: 'Scala', preco: 40 },
  { nome: 'Rust', preco: 22 },
  { nome: 'Elixir', preco: 50 },
  { nome: 'PHP', preco: 15 },
  { nome: 'Java', preco: 30 },
  { nome: 'C++', preco: 35 },
  { nome: 'Go', preco: 45 }
]
1 resposta

Olá Marcelo, tudo bem?

Desde já peço desculpa pela demora para responder o seu tópico.

Pelo que pude perceber, o problema está na função ordena. Na linha 14, a comparação está sendo feita com itemAtualParte1.preco e itemAtualParte1.preco, sendo que deveria ser com itemAtualParte1.preco e itemAtualParte2.preco.

Altere essa linha para:

if (itemAtualParte1.preco < itemAtualParte2.preco) {

Assim, a comparação será feita corretamente e o array será ordenado corretamente.

Espero que eu tenha lhe ajudado, caso tenha mais dúvidas ou problemas com relação a este tópico, estarei à disposição para ajudá-lo.

Grande abraço e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.