Alasca 0 Denunciar post Postado Setembro 24, 2015 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
(RNU) Ruan Silva 61 Denunciar post Postado Setembro 24, 2015 //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
Alasca 0 Denunciar post Postado Setembro 25, 2015 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