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

Implementação de QuickSort não está funcionando com Strings

package br.com.alura.notas;

public class TestaOrdenacaoRapida { // QuickSort

public static void main(String[] args) {

    String[] nomes = { "Maria", "Camila", "Fernando", "Jonas", "Andressa", "Paloma", "Alberto", "Junior", "Enzo",
            "Paulo" };

    ordena(nomes, 0, nomes.length);
    for (int atual = 0; atual < nomes.length; atual++) {
        System.out.println(nomes[atual]);
    }

}

private static void ordena(String[] string, int de, int ate) {

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

private static int particiona(String[] nomes, int de, int ate) {

    String pivo = nomes[ate - 1];
    int menores = 0;
    for (int analise = 0; analise < ate - 1; analise++) {

        String atual = nomes[analise];

        if (atual.compareTo(pivo) < 0) {
            troca(nomes, analise, menores);
            menores++;
        }
    }
    troca(nomes, ate - 1, menores);
    return menores;
}

private static void troca(String[] string, int de, int para) {
    String string1 = string[de];
    String string2 = string[para];

    string[de] = string2;
    string[para] = string1;
}

}

1 resposta
solução!

Olá, Mateus! Como vai? Espero que esteja bem!

Pelo código que você compartilhou, identifiquei um pequeno erro na chamada do método ordena dentro do método ordena em si. Na linha ordena(string, ate, posicaoDoPivo);, acredito que o correto seria ordena(string, de, posicaoDoPivo);, para garantir que a chamada recursiva esteja ordenando a parte correta do array.

Além disso, notei que na chamada do método ordena no método main, você está passando nomes.length como o valor de ate, mas o correto seria nomes.length - 1, uma vez que o índice do último elemento é nomes.length - 1.

Dessa forma, sugiro que você faça as seguintes alterações no seu código:

private static void ordena(String[] string, int de, int ate) {
    int elementos = ate - de;
    if (elementos > 1) {
        int posicaoDoPivo = particiona(string, de, ate);
        ordena(string, de, posicaoDoPivo); // Correção aqui
        ordena(string, posicaoDoPivo + 1, ate);
    }
}
public static void main(String[] args) {
    String[] nomes = { "Maria", "Camila", "Fernando", "Jonas", "Andressa", "Paloma", "Alberto", "Junior", "Enzo",
            "Paulo" };

    ordena(nomes, 0, nomes.length - 1); // Correção aqui
    for (int atual = 0; atual < nomes.length; atual++) {
        System.out.println(nomes[atual]);
    }
}

Com essas alterações, o algoritmo de ordenação deve funcionar corretamente para strings.

Espero ter ajudado!

Caso tenha dúvidas, fico à disposição.

Abraços e bons estudos!

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