2
respostas

A função mergeSort não funciona adequadamente.

A função após ordenar as listas edFolha e edGalho não as juntam. Função mergeSort:

const listaLivros = require("./arrays");
const ordena = require("./ordena");

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;
}

console.log(mergeSort(listaLivros));

Função ordena:

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

module.exports = {ordena};

O output da função mergeSort:

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

Como pode-se ver, as duas listas não se uniram. Eu já tentei colocar a função ordena no mesmo arquivo, mas mesmo assim não funcionou. O que eu estou fazendo de errado? Acho que estamos diante do icônico fenômeno: "mas no meu computador funcionou"

2 respostas

ATUALIZAÇÃO O problema está no aquivo array.js, as constantes edFolha e edGalho foram trocadas por apenas uma chamada constante listaLivros

const listaLivros = [
  {
    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
  },
]

module.exports = listaLivros

Diferentemente do arquivo arrays.js que eu estava importando:

const edFolha = [
  {
  titulo: "PHP",
  preco: 15
  },
  {
    titulo: "JavaScript",
    preco: 25
  },
  {
    titulo: "Java",
    preco: 30
  },
  {
    titulo: "Go",
    preco: 45
  },
  {
    titulo: "Elixir",
    preco: 50
  }
]

const edGalho = [
  {
    titulo: "Python",
    preco: 20
  },
  {
    titulo: "Rust",
    preco: 22
  },
  {
    titulo: "Ruby",
    preco: 28
  },
  {
    titulo: "C#",
    preco: 33
  },
  {
    titulo: "C++",
    preco: 35
  },
  {
    titulo: "Scala",
    preco: 40
  }
]

module.exports = {edFolha, edGalho}

Toda via fica a minha dúvida: a função mergeSort não deveria pegar essas duas listas separadamente, ordena-las e depois uni-las numa única, como foi mostrado na aula 1?

Olá Vinicius! Tudo bem?

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

Pelo que pude ver no seu código, a função mergeSort está ordenando corretamente as duas partes da lista, mas não está juntando essas partes em uma única lista ordenada. Isso ocorre porque a função ordena está retornando apenas a lista ordenada, mas não está juntando as duas partes em uma única lista.

Para que as duas partes sejam juntadas em uma única lista, você pode fazer uma pequena modificação na função mergeSort. Ao invés de atribuir o resultado da função ordena à variável array, você pode concatenar as duas partes ordenadas utilizando o método concat. Ficaria assim:

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 = parte1.concat(parte2);
        array = ordena(parte1, parte2);
    }

    return array;
}

Dessa forma, a função mergeSort irá concatenar as duas partes ordenadas em uma única lista e, em seguida, chamar a função ordena para ordenar essa lista.

Espero ter ajudado e bons estudos!

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