1
resposta

[Dúvida] mergeSort

Meu código index.js da aula de mergeSort não funciona e eu não entendo o porquê alguém poderia me explicar ?

const listaLivros = require('./array')


function mergeSort(array, nivelAninhamento = 0){

    console.log(`Nivel de aninhamento: ${nivelAninhamento}`)

    if (array.length < 1) {
        
        const meio = Math.floor(array.length / 2) //Arredonda número pra baixo
        const parte1 = mergeSort(array.slice(0, meio), nivelAninhamento++);
        const parte2 = mergeSort(array.slice(meio, array.length), nivelAninhamento++);

        array = ordena(parte1, parte2);

        // Recursão é resolver um problema em partes pequenas até a resolução total.
    }

    return array;
}

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


    while (posicaoAtualParte1 < parte1.length && posicaoAtualParte2 < parte2.length) {
        let produtoAtualParte1 = parte1[posicaoAtualParte1] // Atribui o produto da lista1 a posição atual da parte 1.
        let produtoAtualParte2 = parte2[posicaoAtualParte2] // Atribui o produto da lista2 a posição atual da parte 2.

        if (produtoAtualParte1.preco < produtoAtualParte2.preco){
            resultado.push(produtoAtualParte1) // Manda pro final do array.
            posicaoAtualParte1++ // Anda +1 indice.
        } else {
            resultado(produtoAtualParte2) // Manda pro final do array.
            posicaoAtualParte2++ // Anda +1 indice.
        }
    }

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


console.log(mergeSort(listaLivros))

Esse é o resultado que eu tenho :

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

Olá Bruno, tudo bem com você?

Peço desculpa pela demora para responder o seu tópico.

Analisando o seu código, percebi um ponto de ajuste e o que estava causando o seu problema, vou listá-los logo abaixo:

  • O que estava causando o seu problema é que na sua estrutura de condição na função ordena(), mais especificamente no trecho do "else", você utilizou a variável resultado como uma função que recebe o parâmetro produtoAtualParte2, em vez de passá-la para dentro da lista resultado. Para solucionar isso, basta adicionar o método .push a frente da variável resultado, como no exemplo abaixo:

    else {
        resultado.push(produtoAtualParte2);
        posicaoAtualParte2++;
    }
    
  • O ponto de melhoria que comentei é na sua condição dentro do if na função mergeSort(), que apresenta a comparação: array.length < 1, onde vai ordenar de forma decrescente em vez de crescente que seria: array.length > 1. Não é um problema em si, apenas estou comentando caso tenha feito isso sem querer a se atentar essa diferença.

Espero ter lhe ajudado. Caso tenha mais dúvidas, estarei à disposição.

Grande abraço e bons estudos!

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