Adaptar bubleSort em ag

Boa noite pessoal.
Estou com um problema para modificar um bubleSort improvisado no segundo for e não consigo acertar a lógica. Eu preciso fazer um método recebe um arraylist de indivíduos chamado ‘população’ e existe também um array vazio que receberá indivíduos ordenados por rank, porém o rank não está dentro do indivíduo (o que impossibilita de fazer Comparable.sort por rank) e o rank não será gravado no array e será calculado para cada indivíduo apenas uma vez. Queria saber o que fazer para transferir os valores do arraylist para o array baseado no rank, por exemplo:

O primeiro trecho antes do pipe caracteriza o indivíduo, o segundo a aptidão e o terceiro é o rank, ou seja: indivíduo | aptidão | rank
obs: o rank é descartável e não será salvo ele serve somente para a ordenação estou enviando set para indivíduo somente para testes.

saída atual:
9 4 5 5 8 9 5 0 9 | 1,37977 | 2,67398
4 9 8 8 0 5 3 0 6 | 0,37499 | 3,17395
7 3 2 8 9 8 2 3 7 | 1,99655 | 2,36707
6 9 8 1 2 1 9 5 2 | 2,86295 | 1,93596
5 1 2 0 6 4 1 2 3 | 1,23578 | 2,74563

saída esperada no console:
4 9 8 8 0 5 3 0 6 | 0,37499 | 3,17395
5 1 2 0 6 4 1 2 3 | 1,23578 | 2,74563
9 4 5 5 8 9 5 0 9 | 1,37977 | 2,67398
7 3 2 8 9 8 2 3 7 | 1,99655 | 2,36707
6 9 8 1 2 1 9 5 2 | 2,86295 | 1,93596

saída a ser gravada no array ‘não possui rank’:
4 9 8 8 0 5 3 0 6 | 0,37499
5 1 2 0 6 4 1 2 3 | 1,23578
9 4 5 5 8 9 5 0 9 | 1,37977
7 3 2 8 9 8 2 3 7 | 1,99655
6 9 8 1 2 1 9 5 2 | 2,86295

[code] Double rankInicial = Double.MIN_VALUE, melhorAptidao = Double.MIN_VALUE, piorAptidao = Double.MAX_VALUE, rankCorrente, aptidaoCorrente;
Individuo2[] listaIndividuos = new Individuo2[populacao.size()];

    for (int i = 0; i < populacao.size(); i++) {
        if (melhorAptidao < (aptidaoCorrente = populacao.get(i).getAptidao())) {
            melhorAptidao = aptidaoCorrente;
        }
        if (piorAptidao > aptidaoCorrente) {
            piorAptidao = aptidaoCorrente;
        }
    }
    // bubleSort nesse laço
    for (int i = 0; i < populacao.size(); i++) {
        // equação para determinar o rank do individuo atual
        rankCorrente = (populacao.size() - populacao.get(i).getAptidao()) * (melhorAptidao - piorAptidao) / (populacao.size() - 1) + piorAptidao;
        // populacao.get(i).setRank(rankCorrente); // somente para teste na solução real não existe método setRank
        for (int j = 0; j < populacao.size() - 1; j++) {
            if (rankInicial.compareTo(rankCorrente) < 0) {
                Individuo2 aux = populacao.get(j);
                listaIndividuos[j] = populacao.get(j + 1);
                listaIndividuos[j + 1] = aux;
            }                
        }            
        rankInicial = rankCorrente;
    }
    
    for (Individuo2 i : listaIndividuos) {
        System.out.println(i.toString());
    }[/code]

Estou a muito tempo tentando implementar esse método de AG, por isso agradeço a todos que tiverem alguma ideia para compartilhar.