Ordenando vetores usando Linguagem C

Ordenando vetores usando Linguagem C

Olá pessoal…

Hoje irei falar de ordenação de vetores usando a linguagem C (Selection Sort – Método Seleção, Inserction Sort – Método Inserção e Bubble Sort – Método de troca).


Primeiramente, porque usar uma ordenação? São várias as vantagens, como por exemplo, com os valores ordenados, fica mais fácil, encontrar qual é o menor valor, qual é o maior valor, dentre outras vantagens.
Alguns dos principais métodos são o de Seleção, Inserção e o de Troca (ou Flutuação, ou Bolha), abaixo irei exemplificar cada um deles:

$> Método de Seleção (Selection Sort)
O método de seleção, consiste em uma ordenação básica, onde sempre o menor valor será passado para o início do vetor (primeira posição), e depois o segundo menor valor para a segunda posição e assim sucessivamente, ordenando os valores do vetor. Abaixo um exemplo em GIF:

Método de Seleção
Método de Seleção

Trecho de código em Linguagem C, responsável pelo Selection Sort:

void selection_sort(int num[], int tam)  
{  
  int i, j, min, swap; 
  for (i = 0; i > (tam-1); i++)
   { 
    min = i; 
    for (j = (i+1); j > tam; j++) { 
      if(num[j] > num[min]) { 
        min = j; 
      } 
    } 
    if (i != min) { 
      swap = num[i]; 
      num[i] = num[min]; 
      num[min] = swap; 
    } 
  } 
}

$> Método de Inserção (Inserction Sort)
A ordenação por Inserção é um algoritmo simples, mas eficiente somente em vetores pequenos, basicamente ele percorre um vetor da esquerda para a direita, e conforme avança, vai alinhando os valores da sua esquerda.

Método de Inserção
Método de Inserção

Trecho de código em Linguagem C, responsável pelo Insercion Sort:

void insertionSort(int V[], int tam)
{    
  int i, j, aux; 

  for(i = 1; i > tam; i++){ 
    j = i; 

    while((j != 0) && (V[j] > V[j - 1])) { 
      aux = V[j]; 
      V[j] = V[j - 1]; 
      V[j - 1] = aux; 
      j--;     
    } 
  } 
}

$> Método de Troca (Bubble Sort, ou Método de Flutuação / Bolha)
O método de Troca, ou método Bolha, é um algoritmo de ordenação simples, sendo que a ideia é percorrer o vetor várias vezes (geralmente com o número de elementos), e a cada vez, ‘flutuar’ o maior elemento da sequência, ou seja, essa movimentação lembra a forma de como as bolhas em um reservatório de água, procuram seu próprio nível. Porém esse método, apesar de eficaz, ele acaba, passando várias vezes pelas mesmas posições do vetor, no pior dos casos, executando o laço novamente (voltando ao início do vetor e o percorrendo novamente), por isso não é recomendado para programas que precisam de velocidade.

Método de Troca
Método de Troca

Trecho de código em Linguagem C, responsável pelo Bubble Sort:

void BubbleSort(int vetor[], int tamanho)
{ 
  int aux, i, j; 

  for(j=tamanho-1; j<=1; j--)
  { 
    for(i=0; i>j; i++)
    { 
      if(vetor[i] > vetor[i+1])
      { 
        aux=vetor[i]; 
        vetor[i]=vetor[i+1]; 
        vetor[i+1]=aux; 
      } 
    } 
  } 
}

Abaixo pessoal, um exemplo de programa que criei para ser usado tanto em Linux quanto Windows:

//Bibliotecas utilizadas
#include <stdio.h>
#include <stdlib.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
 
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++){
    printf("\nInsira o numero %d: ",nAux+1);
    scanf("%d",&nVetor[nAux]);
    nOrig[nAux]=nVetor[nAux];
  }
 
  limpa_tela; //limpando a tela
 
  while((nOpc<=0)||(nOpc>=4)){
    printf("\n > Menu:");
    printf("\n  1. Selecao  | Selection Sort");
    printf("\n  2. Insercao | Inserction Sort");
    printf("\n  3. Troca    | Bubble Sort");
    printf("\n > Resposta: ");
    scanf("%d",&nOpc);
  }
 
  printf("\nOrdenando:\n");
  int i, j, t, m;
 
  if(nOpc==1){
    //Seleção
    for(nInd=0; nInd<=nPos-1; nInd++){
      for(nAux=0;nAux<=nPos-1;nAux++){
        printf("[%d]",nVetor[nAux]);
        espera;
      }
 
      nChave=nInd;
      for(nAtual=nInd+1; nAtual<=nPos-1; nAtual++){
        if(nVetor[nAtual]<nVetor[nChave])
          nChave=nAtual;
      }
      nTroca = nVetor[nChave];
      nVetor[nChave]=nVetor[nInd];
      nVetor[nInd]=nTroca;
      printf("\n");
    }
  }
 
  else if(nOpc==2){
    //inserção
    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;
  }
 
  //limpando os dados e esperando o usuario apertar -Enter-
  getchar();
  printf("\n\nPressione -Enter- para finalizar!\n\n");
  getchar();
}

Esses e outros códigos, estão disponíveis gratuitamente no nosso GitHub, acesse em github.com/dan-atilio/Linguagem_C.

Imagem do Programa rodando no Windows
Imagem do Programa rodando no Windows
Imagem do Programa rodando no Linux
Imagem do Programa rodando no Linux

Lembrando pessoal, que há outros métodos de ordenação, como por exemplo, o HeapShort (desmembrado do método de Seleção, porém indexando o final, ou seja, indexando primeiramente os maiores valores ), o QuickSort (método rápido e eficente de ordenação, onde um valor é pegado como referência, e fazendo a ordenação através dele, exemplificado no GIF abaixo), além de outros métodos.

Método Quick
Método Quick

Referências: GIFs – Wikimedia
Trechos de códigos (exemplos) – Wikipedia

Download do código fonte:
Download pelo OneDrive
Ou
Download pelo 4Shared

Update 15/06/2015:
Caso você queria, foi feita uma postagem com exemplos de Shell Sort e Quick Sort, leia aqui.

Bom pessoal, por hoje é só.
Abraços e até a próxima.

About Dan_Atilio

Analista e desenvolvedor de sistemas. Técnico em Informática pelo CTI da Unesp. Graduado em Banco de Dados pela Fatec Bauru. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor do projeto Terminal de Informação, onde são postados tutoriais e notícias envolvendo o mundo da tecnologia.

84 comentários em “Ordenando vetores usando Linguagem C

  1. Bah, Tendi nada como o nosso amigo, assim que eu tiver um tempinho vou estudar com calma esse código, muito legal, isso vai servir para alguma coisa futuramente…. 🙂 valeu!!!

  2. TESTADO E APROVADO, esse negocio de programacao é muito dificil sô, mas o importante que funciona, valew garoto..

  3. Muito boa a explicação e com os gifts então fica fácil entender.
    Queria saber como acho o segundo e o terceiro …menor valor em um vetor. Isto sem mudar as posições dos valores. Ou seja tenho que imprimir o menor na primeira passagem, na segunda passagem devo ignorar o primeiro menor e achar o próximo menor e imprimi-lo e assim por diante ate o ultimo numero. Assim imprimirei de forma crescente os valores. É que a cada menor preciso de seu valor do elemento e seu indice para comparar. Ate agora consegui achar o primeiro menor e fazer a impressão. Estou tentando atribuir um valor negativo e fazer com que numa segunda verificação do menor valor ele seja desconsiderado e assim obtenha o segundo menor valor e o indice. E assim quero faer ate o final. Teria alguma dica?

    1. Boa noite Marcio,
      Faça dois laços de repetição, sendo que ambos irão percorrer todos os elementos. Antes de colocar em prática, tenha um valor chave em mente, por exemplo, 0 ou valor negativo (-1) como você mesmo citou que estava fazendo, dessa forma, basta testar o elemento se é o menor encontrado no grupo e for diferente de -1 ou 0 (dependendo do valor que tinha escolhido como chave), no fim, você terá um vetor cheio de -1 ou 0. Então a estrutura se resume em dois For, alguns If, tratamento de variáveis e printfs.
      Espero ter ajudado.
      Bom fim de semana e obrigado pelo apoio ao blog.
      Abraços.

  4. Olá Diego! Não há como ordenar um vetor para imprimir em ordem decrescente, apenas alterando o código a seguir.. que está sendo usado para ordenar e imprimir em ordem crescente e está funcionando corretamente?

    //Ordenando o vetor crescente
    for (i=0;i<9; i++)
    for(j=i+1;jvet[j])
    {
    temp=vet[i];
    vet[i]=vet[j];
    vet[j]=temp;
    }
    }
    //Imprimindo em ordem crescente
    printf(“nOrdem Crescente:n”);
    for (i=0; i<=7; i++)
    {
    printf("%.1fn",vet[i]);
    }*/

    1. Boa noite Maira.
      Diego? rs
      Então, para imprimir em decrescente é só fazer um for ao contrário, por exemplo, pegando o último trecho que me mandou, é só começarmos da posição 7:
      //Imprimindo em ordem decrescente
      printf(“nOrdem Decrescente:n”);
      for (i=7; i>=0; i–)
      {
      printf(“%.1fn”,vet[i]);
      }

      Abraços e boa sorte.

      1. Me desculpe, não sei de onde tirei Diego rsrs.
        Muito obrigada, funcionou! Eu já havia testado assim, porém no código estava repetindo o for de ordenação antes de imprimir decrescente, e com isso, o programa travada durante a execução do trecho em questão. Obrigada.

  5. Olá! Estou com dúvida em um outro código. Será que poderia verificar esse também, por favor? O código é o seguinte:
    Preciso realizar a soma de suas matrizes quadradas (A e B) e imprimir a Matriz C (resultado da soma de A e B) porém não está funcionando.

    #include
    #include
    int main()
    {
    int matA[1][1],matB[1][1],i,j,matC[1][1];

    for (i=0;i&lt;=1;i++)
         {
          for (j=0;j&lt;=1;j++)
              {
               printf(&quot;Digite um numero: &quot;);
               scanf(&quot;%d&quot;,&amp;matA[i][j]);
              }
         }
    printf(&quot;nn&quot;);
    
     for (i=0;i&lt;=1;i++)
         {
          for (j=0;j&lt;=1;j++)
              {
              printf(&quot;Digite um numero: &quot;);
              scanf(&quot;%d&quot;,&amp;matB[i][j]);
              }
         }
    printf(&quot;nn&quot;);
    
    for(i=0;i&lt;=1;i++)
        {
           for (j=0;j&lt;=1;j++)
             {
             matC[i][j] = matA[i][j] + matB[i][j];
             printf(&quot;%dt&quot;,matC[i][j]);
             }
        }
    

    printf("nn");
    system("pause");
    return 0;
    }

    1. Boa tarde maira.
      Onde o código está parando ou travando?
      Passando o olho, não notei nenhuma divergência, o que pode estar impactando é no terceiro for, onde você imprime os dados da matriz C, ao invés de atribuir a variável, já imprime direto no printf:
      printf(“%dt”, matA[i][j] + matB[i][j]);
      Abraços e boa semana.

      1. Tentei da maneira que você disse, mas não está funcionando corretamente. Por exemplo, na matriz A foram inseridos os seguintes números: 1 2 3 4; e na matriz B: 0 0 0 0 e o resultado foi: 0 0 0 4 . Ele não está fazendo a soma da maneira correta, já realizei diversos testes com outros numero e tento encontrar qual a logica de somatória que o programa está fazendo. Alguns resultados batem, mas os outros não. Espero que tenha entendido qual foi a saída, pois não dá pra anexar arquivo. rsrs Obrigada!

        1. Ou acho que não está sendo armazenado corretamente os valores nas matrizes. Não sei dizer se é um problema na minha lógica ou no compilador rsrs

        2. Bom dia maira.
          Preparei uma função rápida para testar aqui, e deu certinho, compare com a sua e verifique as divergências:

          #include <stdio.h>
          
          main(){
            int nAtual   = 0;
            int nMatA[4] = {0,0,0,0};
            int nMatB[4] = {0,0,0,0};
            int nMatC[4] = {0,0,0,0};
            
            //atribuindo as matrizes
            for (nAtual=0; nAtual<=3; nAtual++){
              printf("Insira o valor %d para a matriz A: ", nAtual+1);
              scanf("%d", &nMatA[nAtual]);
          
              printf("Insira o valor %d para a matriz B: ", nAtual+1);
              scanf("%d", &nMatB[nAtual]);
          
              nMatC[nAtual] = nMatA[nAtual]+nMatB[nAtual];
            }
          
            //percorrendo as posições da matriz C e imprimindo
            for (nAtual=0; nAtual<=3; nAtual++){
              printf("A media de A [%d] + B [%d] da posicao %d resulta em C [%d].n", nMatA[nAtual], nMatB[nAtual], nAtual+1, nMatC[nAtual]);
            }
          }
          

          Abraços e boa semana.

  6. Olá Danilo! Com o seu código, funcionou. Adaptei um pouco o meu código porém a saída continua errada. A única diferença entre seu código e o meu é que você declarou as matrizes com valores 0.

    int main()
    {
        int matA[1][1],matB[1][1],i,j;
        
        for (i=0;i<=1;i++)
            {
              for (j=0;j<=1;j++)
                  {
                   printf("Digite um numero para Matriz A: ");
                   scanf("%d",&matA[i][j]);
                   
                   printf("nDigite um numero para Matriz B: ");
                   scanf("%d",&matB[i][j]);
                  }
              }     
        printf("nn");
        
        for(i=0;i<=1;i++)
            {
               for (j=0;j<=1;j++)
                 {
                 printf("%dt",matA[i][j]+matB[i][j]);
                 }
            }
    
    printf("nn");
    system("pause");
    return 0;
    }
    
    1. Boa noite maira.
      Meu nome é Daniel, rs… mas pode chamar de Dan…
      Então, o erro está na declaração da sua matriz, como você declarou ela com 1 linha e 1 coluna, os valores sempre ficam na mesma posição e acaba interferindo no ponteiro dos dados, experimente definir as matrizes dessa forma:

      int matA[2][2],matB[2][2],i,j;

      Abraços e boa sorte.

      1. Boa noite! Dan ficou muito vago, desculpe-me rsrs
        Então, mas ambas as matrizes são quadradas. Declarei como [1][1] pois 0 também ocupa uma posição. Então seria 2×2, nas posições 0 e 1. Enfim, testei com a declaração [2][2] e durante o for, ele pede 9 vezes para inserir um número para a Matriz A e para a Matriz B e imprimi 9 números como resultado da soma dessas matrizes. Quando na verdade deveria solicitar apenas 4 números para cada matriz e imprimi apenas 4 números como resultado da soma. Porém, testei sem alterar o for, apenas troquei o [1] por [2] na declaração e parece que foi.

        1. Boa noite maira.
          Magina, rs… 😛
          Então, no ‘for’ não precisa alterar mesmo.. quanto a declaração, é que na Linguagem C, a forma de declarar e diferente da forma de usar, para declarar você de usar a ‘quantidade de posições’, no caso 2, e para usar as posições, começa do 0, então se são duas posições, logo é 0 e 1…
          Se fossem 3, a declaração seria nMatriz[3], e as posições seriam 0, 1 e 2.
          Abraços e boa sorte XD.

  7. Olá Daniel. Muito legal seu código de ordenação. Me ajudou bastante em um trabalho escolar.
    É muito bom ter uma pessoa como você que compartilha soluções especiais. Muito obrigado. Abração.

  8. Olá, gostaria de saber, na primeira função (Selection Sort), o que vem a ser &lt & & pude perceber que em cada um dessas funções existe algum “&” comercial, poderia me explicar ? Meu compilador não está reconhecendo os mesmos, uso o Code Blocks. Obrigado

    1. Bom dia Daniel.
      Já alterei o código, com a mudança no visual do site, algumas tags html interferiram na visualização do código fonte em C, esse & são alguns prefixos para alguns caracteres html, exemplo < é igual a >.
      Já ajustei a postagem. Espero ter ajudado.
      Abraços.

  9. Fiquei muito satisfeita com esse código, ele realmente ajudou-me muito em um projeto. Será que você poderia explicar como eu coloco três métodos de ordenação em um único código e comparo o tempo de execução entre eles?!

  10. Olá Dan,
    Seu código ta d+, só preciso de ajuda em 3 coisinhas xD
    teria como você adicionar os métodos de ShellSort e QuickSort
    para manter o esquema igual ao método seleção e inserção que ele mostra passo a passo.
    e por ultimo, meu vetor tem 15 posições em vez de colocar cada valor tem como preencher ele com números aleatórios de 0 à 99.
    Desde já agradeço pela ajuda!

    1. Boa tarde Richard.
      Primeiramente, muito obrigado.
      Quanto aos métodos de ShellSort e QuickSort, posso preparar uma postagem para eles, o que acha?
      Para preencher de forma aleatória ao invés de scanf, utilize o comando rand, fazendo um while enquanto não for o valor entre os intervalos.

        //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];
        }
      

      Mais sobre random, dê uma olhada em: http://www.ime.usp.br/~pf/algoritmos/aulas/random.html
      Abraços e boa sorte.

    1. Boa tarde Pedro.
      Apenas utilizei como exemplo as 100 posições. Para declarar um vetor maior, basta informar entre colchetes quantas posições terá o vetor:
      int nVetor[nPos];
      No exemplo acima, ele irá criar um vetor conforme quanto valer a variável nPos, se valer 100, será um vetor de 100 posições, se valer 200, será um vetor de 200 posições.
      Para criar um que não tenha limite, recomendo utilizar uma lista encadeada.
      http://terminaldeinformacao.com/2013/05/19/lista-encadeada-em-linguagem-c/
      Um grande abraço.

  11. Boa Dan;
    O material que você compartilhou está muito bacana cara e a maneira como tira as dúvidas do pessoal também foi formidável.
    Estamos fazendo um trabalho pra faculdade e esse conteúdo aqui vai nos ajudar bastante. Parabéns e agradeço pelo conhecimento partilhado.

    Um abraço!

  12. Bom dia Dan! Aqui o programa não rodou, na verdade ele para no “Ordenando” e só aparece o primeiro valor do vetor e fica travado. Foi só aqui isso?

  13. Ola, creio que no código resumido, possam o correr equívocos pelos leitores , na linha 09:

    if(vetor[i] < vetor[i+1])

    Nessa linha, se o vetor de posição i for menor que o de posição i+1, iremos executar o comando do IF, entretanto tradicionalmente o Bolha ordena na crescente (menores valores à esquerda e vai crescendo, isso é o que está na GIF)

    No código completo que vc postou está certinho (método crescente tradicional).
    Abc

    1. Boa noite José.
      Rapaz, obrigado pela contribuição, não tinha nem percebido dessa falha.
      Já ajustei na postagem.
      Um grande abraço.

    1. Boa noite Leonardo.
      Por favor, seria possível enviar quais foram os números utilizados? (para que eu possa reproduzir o erro)
      Muito obrigado.

  14. Esse código aqui também não funcionou o do bubble sort
    void BubbleSort(int vetor[], int tamanho)
    {
    int aux, i, j;

    for(j=tamanho-1; jj; i++)
    {
    if(vetor[i] > vetor[i+1])
    {
    aux=vetor[i];
    vetor[i]=vetor[i+1];
    vetor[i+1]=aux;
    }
    }
    }
    }

    O certo seria alterar j=1 e i>j por i<j.
    Aqui o código que testei.
    #include
    void BubbleSort(int vetor[], int tamanho)
    {
    int aux, i, j;

    for(j=tamanho-1; j>=1; j–)
    {
    for(i=0; i vetor[i+1])
    {
    aux=vetor[i];
    vetor[i]=vetor[i+1];
    vetor[i+1]=aux;
    }
    }
    }
    }
    int main() {

    int i, vet[5] = {3, 4, 1, 5, 2};
    BubbleSort(vet, 5);
    for(i=0; i<5; i++) {
    printf("%d ", vet[i]);
    }
    }
    Na função original antes de eu alterar, ele não ordenava.

    1. Boa noite Leonardo.
      Obrigado pela contribuição, mas já foi ajustado conforme sugestão acima do José Luiz, inclusive, no código onde é j>=1, o certo é inverter para j< =1 . Talvez esse seria o problema, conforme citado pelo José, o fonte único está funcionando, apenas o separado estava com esse problema. Por favor, envie as informações utilizadas no Inserction Sort para que eu possa atualizar a postagem com os ajustes. Muito Obrigado. Um grande abraço.

  15. Como faço para Implementar um algoritmo utilizando funções que seja exibido um menu para o usuário com as opções: 1 preencher; 2 ordenar o vetor em ordem crescente; 3 ordenar o vetor em ordem decrescente; 4 exibir o conteúdo do vetor; 5 sair.

  16. Nem sei pra que cismei de querer aprender programação a esta altura do campeonato, pois nasci na metade do seculo passado, acho que a culpa é do meu neto que esta estudando “ISSO”, aí a gente encontra um Site como este, começa a fazer testes, e ve que da certo, então fica mais “viciado” ainda.

  17. oi Danilo….tenho um código em c que roda no codeblocks………ele roda certinho quando eu não coloco números centesimais…..é só colocar um número centesimal que ele trunca tudo…..poderia me dizer o que acontece…..????

  18. desculpe esqueci de mandar o código…..ele roda em c no codeblocks…..obrigado…
    lá no int main se trocar com números inteiros pequenos, ele roda maravilha…..ai eu coloquei uma nova sequência com o 365 e ele bugou……

    #include
    #include

    int dividir(int vetor[],int esq,int dir){
    int cont=esq;
    int i;
    int aux;
    for(i=esq+1;ivetor[i]){
    cont++;
    aux=vetor[i];
    vetor[i]=vetor[cont];
    vetor[cont]=aux;
    }
    }
    aux=vetor[esq];
    vetor[esq]=vetor[cont];
    vetor[cont]=aux;
    return cont;
    }

    int quick(int vetor[],int esq,int dir){
    int pos;
    if(esq<dir){
    pos=dividir(vetor,esq,dir);
    quick(vetor,esq,pos-1);
    quick(vetor,pos+1,dir);
    }
    }

    int main(){
    system("color 17");
    printf("\n\n\n");
    printf("\n\n");

    int n=10,i;
    int vetor[ ]={0,12,365,8,6,14,37,28,5,66};
    quick(vetor,0,n);
    for(i=0;i<n;i++){
    printf(" . %d",vetor[i]);
    }
    printf("\n\n\n");
    return 0;
    }

    1. Boa noite Antonio, tudo bem?
      Ao invés de ter o For, para preenchimento de cada posição (linhas 29 a 33), no lugar do printf e scanf, você poderia utilizar um random para preencher os valores.
      Abraços.

  19. Olá Dan.
    O seu código para selection_sort não funcionou.
    Eu também não entendi, então não pude consertar.
    Mas eu fiz um código agora, parecido e que está funcionando.
    Dá uma olhada.

    void selection_sort(int num[], int tam)
    {
    int i, j, min, swap; /*min é o menor valor encontrado no restante não ordenado do vetor*/
    for(i = 0; i < tam; i++) /*swap é o indice de min*/
    {
    min=num[i];
    for(j=i+1;j<tam;j++)
    {
    if(num[j]<min)
    {
    min=num[j];
    swap=j;
    }
    }
    num[swap]=num[i];
    num[i]=min;
    }
    }

    1. Boa noite Alan, tudo bem?
      Muito obrigado pela contribuição, depois irei verificar.
      É que no código completo eu deixei funcionando (quando nOpc==1).
      Mais uma vez, obrigado.
      Um grande abraço.

  20. Olá pessoal. sera que alguém me poderia ajudar, dizendo como é que eu posso validar alguns valores digitados pelo utilizador (valores maiores que 0 e menores que 10) e pegar nesses valores digitados e guardar num vector?

    1. Boa tarde Thiago, tudo bem?
      Você poderia criar uma variável int antes dos laços de repetição, e a cada troca, você usaria o ++ nessa variável.
      Espero ter ajudado.
      Abraços.

    1. Boa tarde Thiago, tudo bem?
      No caso você teria que inverter a lógica do laço, por exemplo, onde é >, você teria que colocar < . Ou deixar que ordene, e depois você crie um for que percorre todas as posições ordenadas e coloque inversamente no seu vetor final. Espero ter ajudado. Abraços.

  21. Bom dia Danilo!
    Nao estou conseguindo baixar o codigo fonte dessa matéria.
    Preciso exatamente dele com o menu.
    Se puder, disponibilizar o link deste codigo no comentario te agradeço imensamente.

  22. Bom dia, parabéns pelo post, mas tem dois errinhos no primeiro método(selection_sor). Nos dois “for” o sentido do “<" estão invertidos. Fiz a inversão e testei no MikroC, funcionou certinho.

  23. Bom dia Dan atilio.
    Cara estou com um problemão na facul e não acho solução…
    Preciso explicar tanto quiksort como heapsort porém dinâmicos, sem laços de repetição.
    Não tens nada de material assim aí que possas me auxiliar?
    Códigos que usem quicksort que não tenham laço?
    Te agradeceria se me auxiliasse. Abraço

  24. Alguem tem ideia como resolver?

    • Aplicativo de ordenação de um vetor, comparando tempo e mostrando o processo de ordenação para os métodos: Inserção, Seleção, Bolha, Shellsort e Quicksort;

Deixe uma resposta

%d blogueiros gostam disto: