3
respostas

Reconstrução do array

Puxa ja estou alguns dias tentando entender o codigo debugando,escrevendo porem estou patinando no mesmo lugar... A teoria entendi muito bem!

O codigo entendi ate reduzir a 1 elemento na parte1 cujo termina com array de 1 elemento ( Go), porem quando inicia o parte2 o array que era de 1 elemento ja vira 2 elementos(Go, C++) , não entendo no codigo quem vai fazendo essa reconstrução...

3 respostas

Olá, Henrique! Tudo bem?

Eu não tenho acesso a esse curso da Alura, mas talvez possa te ajudar.

É possível disponibilizar aqui o enunciado da atividade e sua solução para que eu possa analisar?

Bom fim de semana e bons estudos!

Olá Thatiana segue condigo a baixo

O array podemos considerar um array qualquer ...

const listaLivros = require('./array')

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){
    let posicaoAtualParte1 = 0;
    let posicaoAtualParte2 = 0;   
    const resultado = [];

    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))

Obrigada, Henrique!

Veja se compreendi a sua dúvida e se a minha resposta te esclarece, por favor.

Pelo que entendi, sua dúvida está relacionada à lógica de como o algoritmo de merge sort está reconstruindo o array na função mergeSort().

O que pode estar causando confusão é que, embora o array array seja reatribuído dentro da função mergeSort(), isso não modifica os arrays parte1 e parte2 que foram passados como argumentos. Esses arrays são tratados de forma imutável dentro das funções, pois array.slice() cria cópias dos segmentos do array original, não os modifica diretamente.

Portanto, a reconstrução de array ocorre na mesclagem feita pela função ordena(), onde os elementos de parte1 e parte2 são mesclados em ordem crescente.

Vamos analisar o código em partes.

  1. Na função mergeSort(), a lista de livros é dividida ao meio recursivamente até que cada parte tenha apenas um elemento. Isso é feito dividindo o array original em duas metades, representadas pelas variáveis parte1 e parte2;

  2. Quando as partes são suficientemente pequenas (ou seja, contêm apenas um elemento), elas são passadas para a função ordena() para serem ordenadas e mescladas;

  3. Na função ordena(), duas partes ordenadas são mescladas em um único array ordenado. Ela compara os preços dos produtos em parte1 e parte2, e os insere no array resultado em ordem crescente.

  4. Após a mesclagem, o array resultado é retornado como o array ordenado.

Se esta resposta te ajudou, favor marcar como solucionado ✓