Advertisement
Guest User

Untitled

a guest
Nov 21st, 2014
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.21 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4.  
  5. void swap(int *v, int in, int fi){
  6.     int aux = v[fi];
  7.     v[fi] = v[in]; v[in] = aux;
  8. }
  9.  
  10. void pickapivo(int *u, int tam, int numpivs, int *pivs){
  11.     int i, j;
  12.     int inds[2 * numpivs + 1], vals[2 * numpivs + 1];
  13.    
  14.     for (i = 0; i < 2*numpivs + 1; i++){
  15.         inds[i] = rand()%tam;
  16.         vals[i] = u[inds[i]];
  17.     }
  18.    
  19.     // Agora temos 2 * numpivs + 1 indices aleatorios do vetor. Vamos ordená-los,
  20.     // junto com os seus valores, pra mantermos os índices e valores numa ordem aceitável.
  21.  
  22.     for (i = 0; i < 2 * numpivs; i++){
  23.         for (j = 0; j < 2*numpivs - i; j++){
  24.             if (vals[j] > vals[j+1]){
  25.                 swap (vals, j, j+1);
  26.                 swap (inds, j, j+1);
  27.             }
  28.         }
  29.     }
  30.    
  31.     // Como vals[] e inds[] sofreram as mesmas operacoes de troca, sabemos que os indices
  32.     // em inds[] representam elementos crescentes no vetor. Assim:
  33.    
  34.     for(i = 0; i < numpivs; i++)
  35.         pivs[i] = inds[2 * i + 1];
  36. }
  37.    
  38.  
  39. int partition(int *u, int piv, int l, int r){
  40.     int i = 0, j = 0, indr = l, valpiv = u[piv];
  41.  
  42.     swap(u, piv, r);
  43.    
  44.     for (i = l; i < r; i++){
  45.         if (u[i] < valpiv){
  46.             swap(u, indr, i);
  47.             indr++;
  48.         }
  49.     }
  50.     swap (u, indr, r);
  51.     return indr;
  52. }
  53.  
  54.  
  55. void quicksort(int *t, int n){
  56.     int i, ind, m = n/2;
  57.     if (n == 1 || n == 0)
  58.         return; // Caso base
  59.    
  60.     int piv = 0;
  61.    
  62.    
  63.     // Particionamos
  64.     ind = partition(t, piv, 0, n-1);
  65.    
  66.     printf ("Ind = %d!\n", ind);
  67.    
  68.     quicksort(t, ind + 1);
  69.     quicksort(t + ind + 1, n - ind - 1);
  70. }
  71.  
  72.  
  73. int partition2(int v[], int n, int pivlo, int pivhi, int *piv2){
  74.     int cont = 0;
  75.     int i, j = 0;
  76.    
  77.     int valpivhi = v[pivhi];
  78.     int valpivlo = v[pivlo];
  79.    
  80.     swap(v, pivhi, n-1); // Tiramos o pivo do caminho
  81.     swap(v, pivlo, n-2);
  82.    
  83.     for (i = 0; i < n-2; i++){
  84.         if (v[i] < valpivlo){
  85.             swap(v, i, j);
  86.             j++;
  87.         }
  88.     }
  89.    
  90.     swap(v, j, n-2); // Colocamos o pivo de volta na sua posicao
  91.     *piv2 = j; // Aqui armazenamos o indice do pivo baixo.
  92.  
  93.    
  94.     for (i = j; i < n-1; i++){
  95.         if (v[i] < valpivhi){
  96.             swap(v, i, j);
  97.             j++;
  98.         }
  99.     }
  100.    
  101.     swap (v, j, n-1);
  102.    
  103.     return j;   // Retornamos entao o indice do fim da segunda particao (primeiro pivo)
  104. }
  105.    
  106.  
  107. void quicksort2(int *v, int n){
  108.     int i;
  109.     int res[2];
  110.    
  111.     if (n < 2)
  112.         return; // Casos base
  113.    
  114.     if (n == 2){
  115.         if (v[0] > v[1])
  116.             swap(v, 0, 1); 
  117.         return;
  118.     }
  119.    
  120.     pickapivo(v, n, 2, res); // Colocamos os pivos nas posicoes 0 e 1 de res[]
  121.    
  122.     int piv2;
  123.     int piv1 = partition2(v, n, res[0], res[1], &piv2);
  124.    
  125.        
  126.     if (piv2 == piv1)   // Ou seja, os dois pivôs são iguais e estão naturalmente
  127.         piv2++;         // em posições consecutivas, portanto forçamos a partição a prosseguir.
  128.    
  129.     quicksort2(v, piv1);
  130.     quicksort2(v + piv1, piv2-piv1);
  131.     quicksort2(v + piv2, n-piv2);
  132. }  
  133.  
  134.  
  135.  
  136. int main(void) {
  137.    
  138.    
  139.     /* --------- Leitura e declaracao de dados ----------*/
  140.     int i, tam;
  141.    
  142.     printf ("Digite o tamanho do seu vetor, seguido de seus elementos!\n");
  143.     scanf ("%d", &tam);
  144.    
  145.     int *v = malloc (tam * sizeof(int));
  146.    
  147.     for (i = 0; i < tam; i++)
  148.         scanf("%d", &(v[i]));
  149.     /* ------------------------------------------------- */
  150.  
  151.     quicksort2(v, tam);
  152.    
  153.     printf("Seu vetor, ja ordenadinho e lindjo (LINDAÇO):\n");
  154.     for (i = 0; i < tam; i++)
  155.         printf("%d ", v[i]);
  156.    
  157.     printf("\nIsso ai­!\n\n");
  158.    
  159.     return 0;
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement