Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Alasca

Erro em Métodos de Ordenação em C

Recommended Posts

Olá

 

Estou criando um código em C para ordenar valores de um vetor usando os métodos de ordenação Inserction Sort, Quick Sort e Bubble Sort. O código já está quase pronto, mas o método Quick Sort não está funcionando corretamente. Não sei o que pode estar errado.

Segue o código:

 

//Bibliotecas utilizadas
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>


#ifdef WIN32  //se for windows
#define limpa_tela system("cls") //limpa tela
#define espera Sleep(500) //tempo de delay
#else //senão, ex.: linux
#define limpa_tela system("/usr/bin/clear") //limpa tela
#define espera Sleep(1) //tempo de delay
#endif


//Função do quicksort, que recebe o limite
void quick_sort (int *nArray, int nLimite)
{
    int nAnte, nProx, nMetade, nValAux, nAux;


    //Testando o limite e pegando a metade
    if (nLimite < 2)
        return;
    nMetade = nArray[nLimite / 2];


    //fazendo um for duplo, diminuindo o próximo e aumentando o anterior
    for (nAnte = 0, nProx = nLimite - 1;; nAnte++, nProx--)
    {
        //imprimindo os valores
        for(nAux=0; nAux<=nLimite-1; nAux++)
        {
            printf("[%d]",nArray[nAux]);
            espera;
        }
        printf("\n");


        //enquanto for menor que a metade
        while (nArray[nAnte] < nMetade)
            nAnte++;
        //enquanto a metade for menor que o próximo
        while (nMetade < nArray[nProx])
            nProx--;
        //se o anterior é maior que o próximo quebra o laço
        if (nAnte >= nProx)
            break;


        //fazendo troca de posições
        nValAux = nArray[nAnte];
        nArray[nAnte] = nArray[nProx];
        nArray[nProx] = nValAux;
    }


    //Chamando rotina novamente em recursividade
    quick_sort(nArray, nAnte);
    quick_sort(nArray + nAnte, nLimite - nAnte);
}


main()
{
    //declaração de variáveis
    int nPos=0, nAux=0;
    int nInd=0, nAtual=0;
    int nTroca=0, nChave=0;




    //Quantidade de casas do vetor
    while((nPos<=0)||(nPos>100))
    {
        printf("\nQuantos numeros tera o vetor? ");
        scanf("%d",&nPos);
    }


    //criando o vetor
    int nVetor[nPos], nOrig[nPos], nOpc=-1;


    //preenchendo os dados do vetor
    for(nAux=0; nAux<=nPos-1; nAux++)
    {
        //preenchendo os dados do vetor
        for(nAux=0; nAux<=nPos-1; nAux++)
        {
            nVetor[nAux] = -1;


            //Enquanto não estiver no intervalo
            while( (nVetor[nAux] <= -1) || (nVetor[nAux] >= 100) )
                nVetor[nAux] = rand();


            nOrig[nAux]=nVetor[nAux];
        }
    }


    //Limpando a tela e pegando a opção
    limpa_tela;
    while((nOpc<=0)||(nOpc>=4))
    {
        printf("\n > Menu:");
        printf("\n  1. Insercao   | Inserction Sort");
        printf("\n  2. Quick Sort | Quick Sort");
        printf("\n  3. Troca      | Bubble Sort");
        printf("\n > Resposta: ");
        scanf("%d",&nOpc);
    }
    printf("\nOrdenando:\n");




    if(nOpc==1)
    {
        //Se for Inserction Sort
        for ( nInd=1; nInd<nPos; nInd++)
        {
            for(nAux=0; nAux<=nPos-1; nAux++)
            {
                printf("[%d]",nVetor[nAux]);
                espera;
            }
            nChave = nVetor[nInd];
            nAtual = nInd-1;


            while( nAtual>=0 && nVetor[nAtual]> nChave)
            {
                nVetor[nAtual+1] = nVetor[nAtual];
                nAtual-=1;
                nVetor[nAtual+1] = nChave;
            }
            printf("\n");
        }
    }


    else if (nOpc==3)
    {
        //bubble - troca
        nTroca = nPos - 1 ;
        for(nInd = 0; nInd < nPos; nInd++)
        {
            for(nAux=0; nAux<=nPos-1; nAux++)
            {
                printf("[%d]",nVetor[nAux]);
                espera;
            }


            for(nAtual = 0; nAtual < nTroca; nAtual++)
            {
                if(nVetor[nAtual] > nVetor[nAtual+1])
                {
                    nAux = nVetor[nAtual];
                    nVetor[nAtual] = nVetor[nAtual+1];
                    nVetor[nAtual+1]=nAux;
                }
            }
            nTroca--;
            printf("\n");
        }
    }


    //Resultado - Vetor Original
    printf("\nOriginal: ");
    for(nAux=0; nAux<=nPos-1; nAux++)
    {
        printf("[%d]",nOrig[nAux]);
        espera;
    }




    //Resultado - Vetor Ordenado
    printf("\nOrdenada: ");
    for(nAux=0; nAux<=nPos-1; nAux++)
    {
        printf("[%d]",nVetor[nAux]);
        espera;
    }


    //
    printf ("\n\n");
    system ("\n\npause");
}

Se alguém puder me ajudar a descobrir o que eu fiz de errado, por que o Quick Sort não está funcionando, agradeço muito!

Compartilhar este post


Link para o post
Compartilhar em outros sites

//fazendo um for duplo, diminuindo o próximo e aumentando o anterior
for (nAnte = 0, nProx = nLimite - 1;; nAnte++, nProx--)

 

 

esse ponto e virgula duplo é assim mesmo?

 

 

Pode dizer que erro esta gerando?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O ponto e vírgula duplo é assim mesmo.

 

O erro que ele está apresentando, é que simplesmente não está ordenando o vetor. Ele apenas repete o vetor desordenado. Isso no QuickSort apenas, porque no método de inserção e no de bolha está funcionando bem.

Não consegui encontrar o que eu fiz de errado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.