Acredito ter encontrado um probleminha na lógica do método particiona.
Mesmo quando o chamamos para particionar a segunda parte do array, ele compara com todo o array novamente sem necessidade, tendo em vista que a primeira parte já está ordenada.
Fiz o seguinte ajuste no código para levar em conta a posição inicial:
private static int particiona(Nota[] notas, int inicial, int termino) {
int menoresEncontrados = inicial;
Nota pivo = notas[termino - 1];
for(int analisando = inicial; 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;
}
Realmente faz sentido essa correção na visão de vocês?