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

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.

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.

90 Responses

  1. Osvaldo Aurélio disse:

    Salvo como favoritos kkkkkkkkkkkkkkk pq entender agora ta tenso, mas um dia entenderei 😀

  2. Franchesco disse:

    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!!!

  3. Vinicius Torres disse:

    gostei dos gifs.

  4. luis silveira disse:

    O linux, belezura, ta teta, vou estudar esse codigo, valeu mano.

  5. luis silveira disse:

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

  6. Marcus disse:

    Padrão FIFA!!!!

  7. Marcio disse:

    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?

    • Dan_Atilio disse:

      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.

  8. maira disse:

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

    • Dan_Atilio disse:

      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.

      • maira disse:

        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.

  9. maira disse:

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

    • Dan_Atilio disse:

      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.

      • maira disse:

        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!

        • maira disse:

          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

        • Dan_Atilio disse:

          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.

  10. maira disse:

    Olá Daniel! 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;
    }
    
    • Dan_Atilio disse:

      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.

      • maira disse:

        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.

        • Dan_Atilio disse:

          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.

  11. Claudio disse:

    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.

  12. Daniel disse:

    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

    • Dan_Atilio disse:

      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.

  13. Caoane disse:

    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?!

  14. 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!

    • Dan_Atilio disse:

      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.

  15. Pedro disse:

    Não entendi, porque o vetor só pode ter até 100 posições? como eu faço para criar um vetor maior ?

  16. Douglas Santos disse:

    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!

  17. Jonatan disse:

    Leonardo da Vinci

  18. vinicius lopes disse:

    Daniel baseado nesse programa ai, tem como acrescentar quicksort e merge sort ou outros srts ai?

  19. Guilherme Mariano disse:

    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?

  20. José Luiz disse:

    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

  21. Leonardo_br disse:

    O código do inserction sort não esta correto, não funcionou.

    • Dan_Atilio disse:

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

  22. Leonardo_br disse:

    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.

    • Dan_Atilio disse:

      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.

  23. FRANCISCO ARAUJO disse:

    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.

  24. Samuel Silva disse:

    Cara, muito boa essa sua explicação.
    Muito obrigado!

  25. 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.

  26. Marcos Alonso disse:

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

  27. Marcos Alonso disse:

    oi Daniel….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…..????

  28. Bom dia, amigo como ficaria o código para que ele escolhesse os números aleatoriamente, aumentando as entradas, tipo 100 elementos, 500 elementos e etc..

    • Dan_Atilio disse:

      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.

  29. 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;
    }
    }

  30. Mauro de Castro. disse:

    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?

  31. Asdrubal disse:

    Este trabalho ajudou-me a passar de ano.
    VLW FLW

  32. Thiago disse:

    Boa Tarde, como faria um contador, para contar as trocas feitas?

  33. Thiago disse:

    Boa dia Dan, outra duvida, conforme o seu código como conseguiria ordenar de forma decrescente?

    • Dan_Atilio disse:

      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.

  34. Vitor disse:

    Bom dia Daniel!
    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.

  35. Marcio Silva disse:

    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.

  36. Marcos disse:

    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

  37. Anderson Garcia disse:

    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;

  38. Marina disse:

    OI, boa tarde. Eu queria dar uma olhada no código fonte porém nenhum dos links está funcionando.

  39. REI disse:

    boas eu sou o rei que quero que o grande ex senhor Dan_Atilio ordene um vetor por ordem crescente e decrescente

  40. enes disse:

    comecei agora a dar vetores e strings, estou a tentar ordenar os numeros crescentes e decrescentes, o crescente funciona mas o decrescente nao dá, se me puder ajudar e dizer o que está errado

    #include
    #include

    main()
    {
    int vetor[10];
    int i,x,y,aux=0,ordem;

    printf(“Escolha uma das opcoes abaixo \n”);
    printf(“1. crescente\n”);
    printf(“2. decrescente\n”);
    printf(“> “);
    scanf(“%d”,&ordem);

    switch(ordem){
    case 1:
    for(i=0;i

Deixe uma resposta