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

[Dúvida] Meu código não responde como deveria

A princípio, assisti a aula toda e depois construi meu código. Até criei uma lista mais extensa de livros. Mas na hora de executar, reparei que não estava ordenando. Por fim revisitei os videos e fui construindo conforme a instrutora. Ainda sim meu código não está se ordenando e não consigo encontrar o motivo.

livros.js

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


module.exports = precosLivros;

menorValor.js

const livros = require('./livros');
function menorValor(livros, posicaoInicial) {
    let maisBarato = posicaoInicial;
    for (let atual = 0; atual < livros.length; atual++){
        if (livros[atual].preco < livros[maisBarato].preco){
        maisBarato = atual;
        }
    }
    return maisBarato;
}
module.exports = menorValor

selectionSort.js

const livros = require('./livros.js');
const menorValor = require('./menorValor.js');

for (let atual = 0; atual < livros.length; atual++) {
    let menor = menorValor(livros, atual);
    
    let livroAtual = livros[atual];
    console.log("A posição atual é ",atual);    
    let livroMenor = livros[menor];
    console.log("O livro atual é ",livroAtual);
    console.log("O livro menor é ",livroMenor);
    
    livros[atual] = livroMenor;
    livros[menor] = livroAtual;
}

Com esses códigos, ao executar o "node selectionSort.js" aparece assim

Terminal

A posição atual é  0
O livro atual é  { titulo: 'JavaScript', preco: 25 }
O livro menor é  { titulo: 'PHP', preco: 15 }
A posição atual é  1
O livro atual é  { titulo: 'JavaScript', preco: 25 }
O livro menor é  { titulo: 'PHP', preco: 15 }
A posição atual é  2
O livro atual é  { titulo: 'Java', preco: 30 }
O livro menor é  { titulo: 'PHP', preco: 15 }
A posição atual é  3
O livro atual é  { titulo: 'Elixir', preco: 50 }
O livro menor é  { titulo: 'PHP', preco: 15 }
A posição atual é  4
O livro atual é  { titulo: 'Go', preco: 45 }
O livro menor é  { titulo: 'PHP', preco: 15 }
A posição atual é  5
O livro atual é  { titulo: 'Python', preco: 20 }
O livro menor é  { titulo: 'PHP', preco: 15 }

Alguém pode me ajudar a encontrar o erro?

1 resposta
solução!

Boa tarde, Mariana! O problema está na função menorValor, porque o loop começa sempre do índice 0. Isso faz com que livros já ordenados nas posições anteriores sejam comparados novamente e trocados, bagunçando a ordenação. O ideal é que o loop comece da posição logo após a posicaoInicial, ou seja, posicaoInicial + 1, para que ele procure o menor valor apenas no restante da lista ainda não ordenada.

function menorValor(livros, posicaoInicial) {
    let maisBarato = posicaoInicial;
    for (let atual = posicaoInicial + 1; atual < livros.length; atual++) {
        if (livros[atual].preco < livros[maisBarato].preco) {
            maisBarato = atual;
        }
    }
    return maisBarato;
}