2
respostas

Dúvida no método "particiona"

Ola, pessoal!

Ao implementar o método particiona e utilizá-lo na chamada da ordenação, senti a necessidade de iniciar o contador de menores menoresAteAgora com o valor da variável inicio como segue o código:

public static int particiona(Nota[] notas, int inicio, int termino) {
        int menoresAteAgora = inicio;
        int pivo = termino - 1;

        for (int atual = inicio; atual < termino - 1; atual++) {
            if (notas[atual].getValor() <= notas[pivo].getValor()) {
                troca(notas, atual, menoresAteAgora);
                menoresAteAgora++;
            }
        }
        troca(notas, pivo, menoresAteAgora);
        return menoresAteAgora;
    }

Nos testes, quando utilizo a variável menoresAteAgora e o intervalo de índices não inicia com 0, o valor pode ser trocado de forma incorreta. Por exemplo:

// Exemplo de intervalo analisado
Nota[0] = 3,0
Nota[1] = 5,0
Nota[2] = 4,0

Quando analiso o intervalo (1,2) o contador não incrementa, pois 5,0 > 4,0, logo o método troca é chamado troca(notas, 1, 2). Se eu iniciar a variável sempre com 0 (zero) a troca será feita de forma incorreta. Abaixo seguem as notas utilizadas como entrada:

Nota[] notas = new Nota[] { 
    new Nota("Andre", 4), 
    new Nota("Mariana", 5), 
    new Nota("Carlos", 8.5),
    new Nota("Paulo", 9), 
    new Nota("Jonas", 3), 
    new Nota("Juliana", 6.7), 
    new Nota("Ana", 10),
    new Nota("Lucia", 9.3), 
    new Nota("Guilherme", 7) 
};

é necessário mesmo essa correção ou deixei passar algo?

2 respostas

André, eu observei que o método particiona não utilizava a variável inicio. Utilizei a sua correção e funcionou.Não sou professor, mas me parece que está correto sim. Vamos ver se algum professor responde. Obrigado pelo comentário.

Obrigado pelo feedback, amigo. Abraço!