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.

76 opiniões sobre “Ordenando vetores usando Linguagem C

  • maio 10, 2013 em 7:37 am
    Permalink

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

    Resposta
    • maio 10, 2013 em 1:03 pm
      Permalink

      Grande Osvaldo, rs… que isso brow, entenderá sim XD…
      Abraços e bom fim de semana.

      Resposta
        • maio 7, 2016 em 5:01 pm
          Permalink

          Eu que agradeço Lucas.
          Grande Abraço.

  • maio 10, 2013 em 7:49 am
    Permalink

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

    Resposta
    • maio 10, 2013 em 1:04 pm
      Permalink

      Grande Franchesco…
      Consegue entender sim XD.
      Abraços e bom fim de semana

      Resposta
  • maio 21, 2013 em 4:58 pm
    Permalink

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

    Resposta
  • maio 21, 2013 em 5:07 pm
    Permalink

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

    Resposta
    • maio 21, 2013 em 5:08 pm
      Permalink

      Opa, eu que agradeço novamente luisinho…
      Abração meu querido…

      Resposta
    • novembro 15, 2013 em 11:00 pm
      Permalink

      Boa noite Marcus,
      Muito obrigado pela contribuição ao blog.
      Abraços e bom fim de semana.

      Resposta
  • novembro 14, 2013 em 1:23 pm
    Permalink

    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?

    Resposta
    • novembro 15, 2013 em 11:06 pm
      Permalink

      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.

      Resposta
  • novembro 13, 2014 em 4:24 pm
    Permalink

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

    Resposta
    • novembro 13, 2014 em 7:18 pm
      Permalink

      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.

      Resposta
      • novembro 16, 2014 em 6:22 pm
        Permalink

        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.

        Resposta
        • novembro 16, 2014 em 6:50 pm
          Permalink

          Rs…
          Por nada Maira, eu que agradeço.
          Abraços.

  • novembro 16, 2014 em 6:25 pm
    Permalink

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

    Resposta
    • novembro 16, 2014 em 6:53 pm
      Permalink

      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.

      Resposta
      • novembro 16, 2014 em 8:35 pm
        Permalink

        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!

        Resposta
        • novembro 16, 2014 em 8:38 pm
          Permalink

          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

        • novembro 17, 2014 em 7:21 am
          Permalink

          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.

  • novembro 17, 2014 em 2:22 pm
    Permalink

    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;
    }
    
    Resposta
    • novembro 17, 2014 em 9:23 pm
      Permalink

      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.

      Resposta
      • novembro 17, 2014 em 9:33 pm
        Permalink

        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.

        Resposta
        • novembro 17, 2014 em 9:50 pm
          Permalink

          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.

  • dezembro 1, 2014 em 1:28 pm
    Permalink

    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.

    Resposta
    • dezembro 7, 2014 em 10:36 pm
      Permalink

      Boa noite Claudio.
      Eu que agradeço o acesso e o apoio.
      Abraços e boa semana.

      Resposta
  • maio 10, 2015 em 4:49 pm
    Permalink

    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

    Resposta
    • maio 11, 2015 em 7:21 am
      Permalink

      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.

      Resposta
  • maio 12, 2015 em 9:33 pm
    Permalink

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

    Resposta
    • maio 13, 2015 em 9:54 pm
      Permalink

      Boa noite Caoane.
      Muito obrigado.
      Após inserir os números, você poderia fazer um while ou for no código inteiro, pra sempre ele escolher uma opção de ordenar, quanto ao marcar o tempo, você pode tentar testar a função clock, nunca utilizei ela para esse caso, aqui um link que achei mostrando um exemplo que utiliza: http://www.vivaolinux.com.br/topico/C-C++/Medir-Tempo-de-Execucao
      Abraços e até mais.

      Resposta
  • maio 29, 2015 em 6:33 am
    Permalink

    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!

    Resposta
    • maio 31, 2015 em 6:09 pm
      Permalink

      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.

      Resposta
      • maio 31, 2015 em 9:55 pm
        Permalink

        Opa poderia ser sim uma postagem sobre eles o/
        Muito obrigado por ajudar com o preenchimento aleatória!
        Seu site é muito bom ajuda bastante.
        Obrigado pela atenção!

        Resposta
        • maio 31, 2015 em 11:21 pm
          Permalink

          Boa noite Richard.
          Eu que agradeço.
          Vou ver se consigo um tempo para postar ainda essa semana.
          Um grande abraço.

  • julho 7, 2015 em 4:03 pm
    Permalink

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

    Resposta
    • julho 11, 2015 em 2:19 pm
      Permalink

      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.

      Resposta
  • setembro 3, 2015 em 7:31 pm
    Permalink

    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!

    Resposta
    • setembro 7, 2015 em 9:33 am
      Permalink

      Bom dia Douglas.
      Eu que agradeço.
      Se tiver sugestões de outras postagens, pode entrar em contato.
      Um grande abraço.

      Resposta
  • outubro 27, 2015 em 4:12 pm
    Permalink

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

    Resposta
  • novembro 27, 2015 em 7:53 am
    Permalink

    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?

    Resposta
    • novembro 29, 2015 em 4:47 pm
      Permalink

      Bom dia Guilherme, pode ser o tempo de sleep, tente diminuir o tempo.
      Um grande abraço.

      Resposta
  • março 14, 2016 em 3:39 am
    Permalink

    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

    Resposta
    • março 15, 2016 em 12:19 am
      Permalink

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

      Resposta
  • março 15, 2016 em 9:08 pm
    Permalink

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

    Resposta
    • março 16, 2016 em 1:44 am
      Permalink

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

      Resposta
  • março 17, 2016 em 2:41 am
    Permalink

    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.

    Resposta
    • março 18, 2016 em 12:53 am
      Permalink

      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.

      Resposta
  • março 21, 2016 em 5:34 pm
    Permalink

    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.

    Resposta
  • junho 2, 2016 em 1:33 pm
    Permalink

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

    Resposta
    • junho 5, 2016 em 5:43 pm
      Permalink

      Boa tarde Samuel.
      Muito obrigado jovem, se tiver sugestões, pode entrar em contato.
      Um grande abraço.

      Resposta
  • setembro 5, 2016 em 11:05 pm
    Permalink

    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.

    Resposta
    • setembro 10, 2016 em 11:00 pm
      Permalink

      Boa noite Santo.
      Que história bacana hein, rs…
      Realmente vicia mesmo, esse mundo da computação.
      Um grande abraço, e jamais desista hein, rs.

      Resposta
  • setembro 17, 2016 em 2:24 pm
    Permalink

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

    Resposta
    • setembro 24, 2016 em 9:04 pm
      Permalink

      Boa noite Marcos.
      Você teria o fonte ai? Está usando o tipo float?
      Abraços.

      Resposta
  • setembro 17, 2016 em 2:26 pm
    Permalink

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

    Resposta
    • setembro 24, 2016 em 9:07 pm
      Permalink

      Boa noite Marcos, tudo bem?
      Por favor, mande o fonte por e-Mail, pois pelo comentário aqui, ele zoneia um pouco, rs (até retirou as includes).
      Fico no aguardo.

      Resposta
  • setembro 19, 2016 em 1:53 pm
    Permalink

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

    Resposta
    • setembro 24, 2016 em 9:11 pm
      Permalink

      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.

      Resposta
  • novembro 14, 2016 em 2:44 pm
    Permalink

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

    Resposta
    • novembro 17, 2016 em 11:47 pm
      Permalink

      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.

      Resposta
  • novembro 17, 2016 em 10:27 pm
    Permalink

    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?

    Resposta
    • novembro 17, 2016 em 11:51 pm
      Permalink

      Boa noite Mauro, tudo bem?
      Analise o exemplo completo disponibilizado, o que você quer esta entre as linhas 28 e 33, ai você pode adaptar com if do 0 à 10.
      Abraços.

      Resposta
  • março 2, 2017 em 2:39 pm
    Permalink

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

    Resposta
  • março 17, 2017 em 8:06 pm
    Permalink

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

    Resposta
    • março 19, 2017 em 7:45 pm
      Permalink

      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.

      Resposta
  • março 19, 2017 em 4:06 pm
    Permalink

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

    Resposta
    • março 19, 2017 em 7:52 pm
      Permalink

      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.

      Resposta

Deixe uma resposta