Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Bug] Erro ao ordenar a lista de Livros por preço

O resultado final deveria ser uma lista de livros ordenada por preço mas estou rebendo o retorno da lista original.

array.js

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

index.js

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

function mergeSort (listaL) {

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

    return listaL;
}

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

2 respostas
solução!

Olá,

O problema no código está na condição do if na primeira linha da função mergeSort. Se a lista de livros passada como argumento tiver tamanho menor do que 1, a condição if será verdadeira e a função tentará calcular o índice do meio da lista (const meio = Math.floor(listaL.length / 2);) e particionar a lista em duas partes (const parte1 = mergeSort(listaL.slice(0, meio)); e const parte2 = mergeSort(listaL.slice(meio, listaL.length));). No entanto, como a lista já tem tamanho menor do que 1, o cálculo do índice do meio não fará sentido e a função acabará não realizando a ordenação.

Para corrigir isso, basta mudar a condição do if para verificar se a lista de livros tem tamanho maior do que 1. Assim, a ordenação será realizada corretamente. Além disso, é importante notar que a implementação do algoritmo de ordenação mergeSort não está correta, já que a lógica para realizar a ordenação e combinar as partes ordenadas está incompleta. Abaixo está o código corrigido:

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

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

    const listaOrdenadaParte1 = mergeSort(parte1);
    const listaOrdenadaParte2 = mergeSort(parte2);

    return ordena(listaOrdenadaParte1, listaOrdenadaParte2);
  } else {
    return listaL;
  }
}

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(
    parte1.slice(posicaoAtualParte1),
    parte2.slice(posicaoAtualParte2)
  );
}

const listaOrdenada = mergeSort(listaLivros);
console.log(listaOrdenada);

No código acima, foi corrigida a condição do if na função mergeSort para verificar se a lista tem tamanho maior do que 1. Também foi adicionada uma verificação para retornar a lista original caso ela tenha tamanho menor ou igual a 1. Na função ordena, foi corrigida a lógica para ordenar e combinar as partes ordenadas. Por fim, foi adicionado um trecho de código para imprimir a lista de livros ordenada na tela.

Espero ter ajudado!!

Obrigado pela força Wesley, resolveu o problema que eu estava tendo!

Fiz este exercício copiando a tela do orientador e jurava que estava tudo dentro dos conformes.

Interessante observar como a troca de um sinal pode impactar o restante do código inteiro.

Obrigado pela ajuda!!

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