Ordenação de vetores com BubbleSort

Amigos, estou com um probleminha para ordenar um vetor. Tenho uma classe Aluno, que tem como propriedades as variáveis nota(double) e nome(String). Meu problema é ao ordenar esse vetor de objetos Aluno em ordem crescente, por nome. Por exemplo, com os nomes Roger, Abelha e Zebra, após ordenar, ficaria Abelha, Roger e Zebra (Não consegui pensar em nenhum nome com Z! :roll: )
O meu algorítmo de “Bubblesort” é o seguinte:

    public void ordenarNomeCre(Aluno[] v) { //Método de ordenação de nomes de forma crescente
        boolean trocou = true; 
        while (trocou) {
            trocou = false;
            for (int i = 0; i < v.length - 1; i++) {
                if (v[i].getNome().compareTo(v[i + 1].getNome()) > 0) {
                    Aluno aux = v[i];
                    v[i] = v[i + 1];
                    v[i + 1] = aux;
                    trocou = true;
                }
            }
        }
    }

Usei esta mesma lógica para ordenar o meu vetor de Alunos pela nota, de forma crescente e decrescente, e funcionou perfeitamente, porém (obviamente), não utilizando o compare to e pegando a nota ao invés do nome, dessa forma:

 if (v[i].getNota() > v[i + 1].getNota()) 

Esse método de ordenação de nomes em ordem crescente ordena quase certo, mas algumas coisas ficam fora da ordenação. Para inicializar esse vetor de objetos e eu nao precisar cadastrar todos os alunos (em uma outra classe), eu coloquei um for antes de rodar esse método atribuindo um valor randômico (0 a 50) para o nome e a nota, para cada posição do vetor, dessa forma:

for (int i = 0; i <= 9; i++) { Disciplina.alunos[i] = new Aluno(""+(Math.random()*50), 0+(Math.random()*50)); }
Em um exemplo de funcionamento da classe, obtive o seguinte resultado:

1.5731317866865713
13.657274245610578
25.396175021708657
3.817491875022583
3.8310135853330154
38.41939612141305
39.491764535307645
43.42128443076351
43.79810772111325
47.17088292162792

Como podem ver, começou ordenando e depois alguns valores ficaram fora da ordem. Eu entendi que o problema é que o meu método sempre compara a posição atual com a próxima, talvez teria que comparar a posição atual com todas as outras, não sei. Gostaria que me ajudassem com essa questão, pois estou bem perdido.

Desde já obrigado :slight_smile:

Você percebeu que isso estaria em ordem se tudo fosse strings? Só lembrar que o ponto vem antes dos números.

1.5731317866865713  
13.657274245610578  
25.396175021708657  
3.817491875022583  
3.8310135853330154  
38.41939612141305  
39.491764535307645  
43.42128443076351  
43.79810772111325  
47.17088292162792 

Pelo que imagino, você está fazendo a comparação do campo errado :slight_smile:

entanglement, não entendi a questão de estar em ordem se fossem Strings… Na verdade, são strings, mas têm números dentro (no for que eu mostrei existe um Math.random atribuindo um número randômico de 0 a 50 para cada PALAVRA(String) de nome).
Estou comparando o nome da posição atual do meu vetor com a posição da frente (contador+1)… Me desculpe, mas nao consegui entender o que vc quis dizer

Eu vou dar um exemplo mais boboca, para você entender melhor.

Digamos que você tenha a seguinte lista de Strings:
“1”, “2”, “3”, “5”, “7”, “11”, “13”, “17”, “23”

Se essa lista for ordenada como Strings, não como números, ela vai ficar:
“1”, “11”, “13”, “17”, “2”, “23”, “3”, “5”, “7”.

Entendeu a diferença? É aquela piada do “1” + “1” == “11”.

Aaaaaaaaaaaaah, entendi! Obrigado amigo, tudo certo quanto a isso então! A parte de ordenar de forma decrescente também funcionou perfeitamente :slight_smile:
Segue o código de todos os métodos, caso alguém necessite:


public class BubbleSort {  //BubbleSort Adaptado!

    public void ordenarNotaCre(Aluno[] v) { //Essa ordenação também serve para vetores de int, assim como o de forma decrescente
        boolean trocou = true;
        while (trocou) {
            trocou = false;
            for (int i = 0; i < v.length - 1; i++) {
                if (v[i].getNota() > v[i + 1].getNota()) {
                    Aluno aux = v[i];
                    v[i] = v[i + 1];
                    v[i + 1] = aux;
                    trocou = true;
                }
            }
        }
    }

    public void ordenarNotaDec(Aluno[] v) { //Método de ordenação de notas de forma decrescente
        boolean trocou = true;
        while (trocou) {
            trocou = false;
            for (int i = 0; i < v.length - 1; i++) {
                if (v[i].getNota() < v[i + 1].getNota()) {
                    Aluno aux = v[i];
                    v[i] = v[i + 1];
                    v[i + 1] = aux;
                    trocou = true;
                }
            }
        }
    }

    public void ordenarNomeCre(Aluno[] v) { //Método de ordenação de nomes de forma crescente
        boolean trocou = true;
        while (trocou) {
            trocou = false;
            for (int i = 0; i < v.length - 1; i++) {
                if (v[i].getNome().compareTo(v[i + 1].getNome()) > 0) {
                    Aluno aux = v[i];
                    v[i] = v[i + 1];
                    v[i + 1] = aux;
                    trocou = true;
                }
            }
        }
    }

    public void ordenarNomeDec(Aluno[] v) { //Método de ordenação de nomes de forma decrescente
        boolean trocou = true;
        while (trocou) {
            trocou = false;
            for (int i = 0; i < v.length - 1; i++) {
                if (v[i].getNome().compareTo(v[i + 1].getNome()) < 0) {
                    Aluno aux = v[i];
                    v[i] = v[i + 1];
                    v[i + 1] = aux;
                    trocou = true;
                }
            }
        }
    }
}

Obrigado novamente, até mais!