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

Meu algoritmo não está buscando todos os valores

Quando eu tento procurar uma nota diferente de 9.3 ele falha, não encontra e retorna -1. Segue o meu código:

public static void main(String[] args) {
        Nota guilherme = new Nota("guilherme", 7); 
        Nota[] notas = { new Nota("andre", 4),  
                new Nota("carlos", 8.5),  
                new Nota("ana", 10),
                new Nota("mariana", 5), 
                new Nota("paulo", 9),
                new Nota("lucia", 9.3), 
                new Nota("jonas", 3),
                new Nota("juliana", 6.7), 
                guilherme 
        };

        ordena(notas, 0, notas.length);


        for (Nota nota : notas) {
            System.out.println(nota.getAluno() + " " + nota.getValor());
        }

        int encontrei = busca(notas, 0, notas.length, 6.7);
        System.out.println("Encontrei a nota na posicao: " + encontrei);
    }

    private static int busca(Nota[] notas, int de, int ate, double buscando) {
        if(de > ate) return -1;

        int meio = (de + ate) / 2;
        Nota nota = notas[meio];

        if(buscando == nota.getValor()) return meio;
        if(buscando < meio) return busca(notas, de, meio - 1, buscando);
        return busca(notas, meio + 1, ate, buscando);
    }

    private static void ordena(Nota[] notas, int de, int ate) {
        int elementos = ate - de;

        if(elementos > 1 ) {
            int posicaoDoPivo = particiona(notas, de, ate);
            ordena(notas, de, posicaoDoPivo);
            ordena(notas, posicaoDoPivo + 1, ate);
        }
    }

    private static int particiona(Nota[] notas, int inicial, int termino) {
        int menoresEncontrados = 0;
        Nota pivo = notas[termino - 1];

        for(int analisando = 0; analisando < termino - 1; analisando++) {
            Nota atual = notas[analisando];
            if(atual.getValor() <= pivo.getValor()) {
                troca(notas, analisando, menoresEncontrados);
                menoresEncontrados++;
            }
        }

        troca(notas, termino - 1, menoresEncontrados);
        return menoresEncontrados;
    }

    private static void troca(Nota[] notas, int de, int para) {
        Nota nota1 = notas[de];
        Nota nota2 = notas[para];
        notas[para] = nota1;
        notas[de] = nota2;
    }
}
1 resposta
solução!

Já encontrei o erro, eu estava fazendo a comparação errada.

if(buscando < meio)

O correto seria:

if(buscando < nota.getValor())