Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Imprimindo o resultado de forma incompleta

Está ordenando só 3 itens da lista, por exemplo, PHP, Rust e Ruby, o que há de errado no código?

const listaLivros = 
    [{
        titulo: "Rust",
        preco: 22,
    },{
        titulo: "Ruby",
        preco: 28,
    },{
        titulo: "C#",
        preco: 33,
    }, {
        titulo: "C++",
        preco: 35,
    },{
        titulo: "Scala",
        preco: 40,
    },{
        titulo: "PHP",
        preco: 15,
    },{
        titulo: "JavaScript",
        preco: 25,
    },{
        titulo: "Java",
        preco: 30,
    },{
        titulo: "Go",
        preco: 45,
    },{
        titulo: "Elixir",
        preco: 50,
    },{	
        titulo: "Python",
        preco: 20,
    }];

module.exports = listaLivros;
const listaLivros = require('./arrays');

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

    return array;
}

function ordena(parte1, parte2) {
    const resultado = [];
    let posicaoAtualParte1 = 0;
    let posicaoAtualParte2 = 0;

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

        if (produtoAtualParte1.preco < produtoAtualParte2.preco) {
            resultado.push(produtoAtualParte1);
            posicaoAtualParte1++;
        } else {
            resultado.push(produtoAtualParte2);
            posicaoAtualParte2++;
        }

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

console.log(mergeSort(listaLivros));
1 resposta
solução!

Oi, Thiago! Tudo bem por aí?

Isso está ocorrendo porque, na função ordena(), o comando return está dentro do loop while. Desse modo, o loop está interrompendo na primeira iteração devido ao comando return dentro dele, impedindo que todos os itens da lista apareçam no console.log()!

O comando return deve estar fora do loop while, a fim de que ele consiga completar todas as suas iterações. Após realocar esta estrutura (return), chegaremos no seguinte resultado:

function ordena(parte1, parte2) {
    const resultado = [];
    let posicaoAtualParte1 = 0;
    let posicaoAtualParte2 = 0;

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

        if (produtoAtualParte1.preco < produtoAtualParte2.preco) {
            resultado.push(produtoAtualParte1);
            posicaoAtualParte1++;
        } else {
            resultado.push(produtoAtualParte2);
            posicaoAtualParte2++;
        }
    }

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

Espero ter ajudado, Thiago! Se novas dúvidas surgirem, estarei por aqui.

Um abraço!

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

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software