Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Por algum detalhe meu margeSort tá errado. Ele ordena, e mostra que está ordenando correto, mas tem hora de exibir exibe errado;

package margeS;

public class Principal {

    public static void main(String[] args) {


        Nota[] notasDoMauricio = {
                new Nota("mariana", 5),
                new Nota("andre", 4),
                new Nota("paulo", 9),
                new Nota("carlos", 8.5)    

            };

            Nota[] notasDoAlberto = {

                    new Nota("jonas", 3),
                    new Nota("juliana", 6.7),
                    new Nota("guilherme", 7),
                    new Nota("lucia", 9.3),
                    new Nota("ana", 10)    

            };

            Nota[] rank = margeSort(notasDoMauricio, notasDoAlberto);

            for(int i=0; i<rank.length;i++){

                System.out.println(rank[i].getNome()+": "+rank[i].getValor());

            };



    }

    public static Nota[] margeSort(Nota[] notasDoMauricio, Nota[] notasDoAlberto){
        int total=notasDoMauricio.length+notasDoAlberto.length;

        Nota[] resultado= new Nota[total];

        int atual=0;
        int atualDoMauricio=0;
        int atualDoAlberto=0;

        while(atualDoMauricio<notasDoMauricio.length && atualDoAlberto<notasDoAlberto.length){

            Nota nota1 = notasDoMauricio[atualDoMauricio];
            Nota nota2 = notasDoAlberto[atualDoAlberto];
            System.out.println("Estou comparando "+ nota1.getNome()+": "+ nota1.getValor()+ " com "+nota2.getNome()+": "+ nota2.getValor());

            if(nota1.getValor() <= nota2.getValor()){

                resultado[atual]=nota1;
                atualDoMauricio++;
                atual++;

            }else{

                resultado[atual]= nota2;
                atualDoAlberto++;
                atual++;

            }



        }

        while(atualDoAlberto<notasDoAlberto.length){

        resultado[atual]=notasDoAlberto[atualDoAlberto];
        atual++;
        atualDoAlberto++;

        }

        while(atualDoMauricio<notasDoMauricio.length){

        resultado[atual]=notasDoMauricio[atualDoMauricio];
        atual++;
        atualDoMauricio++;

    }



        return resultado;
    }

}

resultado:

Estou comparando mariana: 5.0 com jonas: 3.0 Estou comparando mariana: 5.0 com juliana: 6.7 Estou comparando andre: 4.0 com juliana: 6.7 Estou comparando paulo: 9.0 com juliana: 6.7 Estou comparando paulo: 9.0 com guilherme: 7.0 Estou comparando paulo: 9.0 com lucia: 9.3 Estou comparando carlos: 8.5 com lucia: 9.3 jonas: 3.0 mariana: 5.0 andre: 4.0 juliana: 6.7 guilherme: 7.0 paulo: 9.0 carlos: 8.5 lucia: 9.3 ana: 10.0

Veja que ele está encaixando sempre a menor nota. O algoritmo me parece igual ao da aula, mas na exibição da problema.

4 respostas

Fala Xará!

Então, estou assumindo que você quis dizer MergeSort ao invés de MargeSort (Não conheço o algoritmo de ordenação da Mulher de Homer Simpson, hehe).

Olhando seu código, vi que vocÊ passa os 2 arrays para ordenar, mas esses 2 arrays não estão ordenados! O seu algoritmo apenas vai pegando o menor valor e colocando no resultado.

O MergeSort é um algoritmo de divisão e conquista se caracteriza por dividir o problema (o array com as notas) e ir ordenando item a item (conquistar). No seu algoritmo faltou essa parte da divisão.

Veja esse gif da wikipedia:

https://pt.wikipedia.org/wiki/Ficheiro:Merge-sort-example-300px.gif

Ele mostra bem o que deve ser feito. Primeiro, vocÊ deve dividir a entrada em pedacinhos menores até que você possa comparar 2 itens e devolver um array ordenado.

O código que você fez é a parte final do algoritmo (conquistar) O que falta você fazer é dividir a entrada e ir ordenando aos poucos.

Esse algoritmo é facilmente implementado com recursão. A pergunta é se você já conhece recursão. Com recursão, a lógica é a seguinte:

mergeSort(Lista){
    if(lista.length > 1){
        //aqui Divide a lista no meio, ae temos Lista1 e Lista2; 
        //Essa parte que está faltando no seu código
        mergeSort(lista1)
        mergeSort(lista2)

        // aqui vc tem de fazer a comparação, 
        //que foi a parte que já ta feita no seu codigo
    }
}

Se você não conhece, te digo, o código fica mais complicado de se entender. Aqui está visualmente como funciona:

http://math.hws.edu/eck/js/sorting/xSortLab.html (escolha merge sort e clica no Run).

Conta um pouco mais do que vocÊ conhece para a gente tentar chegar numa solução legal. abraços, A. Lucas

Até conheço recursão, mas só testei em c e c++. Estou pensando em deixar esse curso, pegar algoritmos e estruturas em c++ e seguir com a carreira java normal. :(

solução!

oi Lucas,

dei uma revisada na aula

https://cursos.alura.com.br/course/projetos-de-algoritmos-2/task/21247

e tem um erro lá!!!!

Ele fala que as notas devem estar ordenadas, mas não estão. Eu, inclusive, sugeri uma melhoria para ajustar isso.

Lá está assim:

Nota[] notasDoMauricio = {
            new Nota("mariana", 5),
            new Nota("andre", 4),
            new Nota("carlos", 8.5),
            new Nota("paulo", 9)

        };

mas deveria estar assim:

Nota[] notasDoMauricio = {
            new Nota("andre", 4),
            new Nota("mariana", 5),
            new Nota("carlos", 8.5),
            new Nota("paulo", 9)

        };

altere o seu codigo para ficar igual ao de baixo e rode novamente. Com isso o codigo vai funcionar como o da aula.

PS.: Desculpe nao ter olhado a aula antes. Vi agora que eles só estão ensinando parte do algoritmo do MergeSort. Nas aulas posteriores, eles ensinarão o restante do algoritmo para que seu código funcione para quaiquer arrays.

Abraços e não desista dos estudos! A. Lucas

Excelente, Antônio!!

Lucas, siga o conselho do Antônio e continue estudando por aí mesmo, você está indo muito bem. Te aconselho continuar e acabar esse curso.