Advertisement
Guest User

Untitled

a guest
Nov 28th, 2014
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.16 KB | None | 0 0
  1. void swap(int *v, int in, int fi){
  2.     int aux = v[fi];
  3.     v[fi] = v[in]; v[in] = aux;
  4. }
  5.  
  6. void pickapivo(int *u, int tam, int numpivs, int *pivs){
  7.     int i, j;
  8.     int inds[2 * numpivs + 1], vals[2 * numpivs + 1];
  9.            
  10.     for (i = 0; i < 2*numpivs + 1; i++){
  11.         inds[i] = rand()%tam;
  12.         vals[i] = u[inds[i]];
  13.     }
  14.                
  15.     // Agora temos 2 * numpivs + 1 indices aleatorios do vetor. Vamos ordená-los,
  16.     // junto com os seus valores, pra mantermos os índices e valores numa ordem aceitável.
  17.              
  18.     for (i = 0; i < 2 * numpivs; i++){
  19.         for (j = 0; j < 2*numpivs - i; j++){
  20.             if (vals[j] > vals[j+1]){
  21.                 swap (vals, j, j+1);
  22.                 swap (inds, j, j+1);
  23.             }
  24.             num++;
  25.         }
  26.     }
  27.                    
  28.                     // Como vals[] e inds[] sofreram as mesmas operacoes de troca, sabemos que os indices
  29.                     // em inds[] representam elementos crescentes no vetor. Assim:
  30.                    
  31.     for(i = 0; i < numpivs; i++)
  32.         pivs[i] = inds[2 * i + 1];
  33.    
  34.     if (numpivs == 3){
  35.             if (pivs[0] == pivs[1])
  36.                 pivs[0] = inds[0];
  37.                
  38.             if (pivs[1] == pivs[2])
  39.                 pivs[2] = inds[6];
  40.                
  41.             num++; num++;
  42.     }
  43.     num++;
  44.  
  45. }
  46.  
  47. int partition(int *u, int piv, int tam){
  48.     int i, j = 0, valpiv = u[piv];
  49.     swap(u, piv, tam-1);
  50.    
  51.     for (i = 0; i < tam-1; i++){
  52.         if (u[i] < valpiv){
  53.             swap(u, j, i);
  54.             j++;
  55.         }
  56.         num1++;
  57.     }
  58.  
  59.     swap (u, j, tam-1);
  60.     return j;
  61. }
  62.                          
  63. void Quicksort1(int *v, int tam){
  64.     numchamadas1++;
  65.     int ind;
  66.     int res[1];
  67.    
  68.     if (tam < 2){
  69.         return; // Casos base
  70.     }
  71.     num1++;
  72.     if (tam == 2){
  73.         if (v[0] > v[1])
  74.             swap(v, 0, 1);
  75.         return;
  76.     }
  77.     num1++;
  78.    
  79.     num1++;
  80.     if (tam == 3){  // Caso base 3
  81.         num1++;
  82.         if (v[0] > v[1]){
  83.             num1++;
  84.             if (v[0] > v[2]){
  85.                 num1++;
  86.                 swap(v, 0, 2);
  87.                 num1++;
  88.                 if (v[0] > v[1])
  89.                     swap (v, 0, 1);
  90.                 }
  91.                 else
  92.                     swap(v, 0, 1);
  93.                 }
  94.             else{
  95.                 num1++;
  96.                 if (v[0] > v[2]){
  97.                     swap(v, 1, 2);
  98.                     swap(v, 0, 1);
  99.                 }
  100.                 else{
  101.                     num1++;
  102.                     if (v[1] > v[2])
  103.                         swap(v, 1, 2);
  104.                 }
  105.             }
  106.         return;
  107.     }
  108.    
  109.     pickapivo(v, tam, 1, res);
  110.     // Particionamos
  111.     ind = partition(v, res[0], tam);
  112.            
  113.     Quicksort1(v, ind);
  114.     Quicksort1(v + ind + 1, tam - ind - 1);
  115. }
  116.  
  117. int partition2(int v[], int n, int pivlo, int pivhi, int *piv2){
  118.     int i, j = 0;
  119.     int indpivlo = pivlo, indpivhi = pivhi;
  120.        
  121.     int valpivhi = v[indpivhi];
  122.     int valpivlo = v[indpivlo];
  123.  
  124.     num2++;
  125.     if (indpivlo == n-1){
  126.         swap(v, indpivhi, indpivlo);
  127.         indpivlo = indpivhi;
  128.     }
  129.    
  130.     swap(v, indpivhi, n-1); // Tiramos o pivo do caminho
  131.     swap(v, indpivlo, n-2);
  132.            
  133.     for (i = 0; i < n-2; i++){
  134.         num2++;
  135.         if (v[i] < valpivlo){
  136.             swap(v, i, j);
  137.             j++;
  138.         }
  139.     }
  140.                    
  141.     swap(v, j, n-2); // Colocamos o pivo de volta na sua posicao
  142.     *piv2 = j; // Aqui armazenamos o indice do pivo baixo.
  143.              
  144.                    
  145.     for (i = j; i < n-1; i++){
  146.         num2++;
  147.         if (v[i] < valpivhi){
  148.             swap(v, i, j);
  149.             j++;
  150.         }
  151.     }
  152.                    
  153.     swap (v, j, n-1);
  154.                    
  155.     return j;       // Retornamos entao o indice do fim da segunda particao (primeiro pivo)
  156. }
  157.  
  158. void Quicksort2(int *v, int tam){
  159.     int res[2];
  160.     numchamadas2++;
  161.     num2++;
  162.     if (tam < 2)
  163.         return; // Casos base
  164.    
  165.     num2++;  
  166.     if (tam == 2){
  167.         if (v[0] > v[1])
  168.             swap(v, 0, 1);
  169.         return;
  170.     }
  171.    
  172.     num2++;
  173.     if (tam == 3){  // Caso base 3
  174.        
  175.         num2++;
  176.         if (v[0] > v[1]){
  177.             num2++;
  178.             if (v[0] > v[2]){
  179.                 swap(v, 0, 2);
  180.                 num2++;
  181.                 if (v[0] > v[1])
  182.                     swap (v, 0, 1);
  183.                 }
  184.                 else
  185.                     swap(v, 0, 1);
  186.                 }
  187.             else{
  188.                 num2++;
  189.                 if (v[0] > v[2]){
  190.                     swap(v, 1, 2);
  191.                     swap(v, 0, 1);
  192.                 }
  193.                 else{
  194.                     num2++;
  195.                     if (v[1] > v[2])
  196.                         swap(v, 1, 2);
  197.                 }
  198.             }
  199.         return;
  200.     }
  201.    
  202.     pickapivo(v, tam, 2, res); // Colocamos os pivos nas posicoes 0 e 1 de res[]
  203.                
  204.     int piv2;
  205.     int piv1 = partition2(v, tam, res[0], res[1], &piv2);      
  206.     Quicksort2(v, piv2);
  207.     Quicksort2(v + piv2 + 1, piv1-piv2 - 1);
  208.     Quicksort2(v + piv1 + 1, tam -piv1 - 1);
  209. }    
  210.  
  211. void partition3(int *v, int tam, int pivlo, int pivmid, int pivhi, int *res){
  212.     int i, j = 0, indpivlo = pivlo, indpivmid = pivmid, indpivhi = pivhi;
  213.     int valpivlo = v[indpivlo], valpivmid = v[indpivmid], valpivhi = v[indpivhi];
  214.    
  215.     /* --------- Checagens chatas pra colocar os pivos ----- */
  216.     num3++;
  217.     if(tam - 1  != indpivlo && tam - 1 != indpivmid)
  218.         swap (v, indpivhi, tam-1);
  219.     else{
  220.         num3++;
  221.         if (indpivlo == tam - 1){
  222.             swap (v, indpivlo, indpivhi);
  223.             indpivlo = indpivhi;
  224.         }
  225.         else{
  226.             swap (v, indpivmid, indpivhi);
  227.             indpivmid = indpivhi;
  228.         }
  229.     }
  230.     num3++;
  231.     if (tam - 2 != indpivlo)
  232.         swap (v, indpivmid, tam-2);
  233.            
  234.     else{
  235.         swap (v, indpivmid, indpivlo);
  236.         indpivlo = indpivmid;
  237.     }
  238.        
  239.     swap (v, indpivlo, tam-3);
  240.        
  241.     /* ---------------------------------------------------- */
  242.        
  243.     for (i = 0; i < tam-3; i++){
  244.         num3++;
  245.         if (v[i] < valpivlo){
  246.             swap(v, i, j);
  247.             j++;
  248.         }
  249.     }
  250.        
  251.     swap(v, j, tam-3);
  252.     indpivlo = j;
  253.        
  254.     for (i = j; i < tam-2; i++){
  255.         num3++;
  256.         if (v[i] < valpivmid){
  257.             swap(v, i, j);
  258.             j++;
  259.         }
  260.     }
  261.                
  262.     swap(v, j, tam-2);
  263.     indpivmid = j;
  264.        
  265.     for (i = j; i < tam-1; i++){
  266.         num3++;
  267.         if (v[i] < valpivhi){
  268.             swap(v, i, j);
  269.             j++;
  270.         }
  271.     }
  272.        
  273.     swap(v, j, tam-1);
  274.     indpivhi = j;
  275.        
  276.     res[0] = indpivlo; res[1] = indpivmid; res[2] = indpivhi;
  277. }      
  278.  
  279. void Quicksort3(int *v, int tam){
  280.     num3++;
  281.     numchamadas3++;
  282.     printf("tam = %d na chamada %d.\n", tam, numchamadas3);
  283.     if (tam < 2)    // Caso base
  284.         return;
  285.    
  286.     num3++;
  287.     if (tam == 2){  // Caso base 2
  288.         if (v[0] > v[1])
  289.             swap (v, 0, 1);
  290.             return;
  291.             }
  292.     num3++;  
  293.     if (tam == 3){  // Caso base 3
  294.         num3++;
  295.         if (v[0] > v[1]){
  296.             num3++;
  297.             if (v[0] > v[2]){
  298.                 swap(v, 0, 2);
  299.                 num3++;
  300.                 if (v[0] > v[1])
  301.                     swap (v, 0, 1);
  302.                 }
  303.                 else
  304.                     swap(v, 0, 1);
  305.                 }
  306.             else{
  307.                 num3++;
  308.                 if (v[0] > v[2]){
  309.                     swap(v, 1, 2);
  310.                     swap(v, 0, 1);
  311.                 }
  312.                 else{
  313.                     num3++;
  314.                     if (v[1] > v[2])
  315.                         swap(v, 1, 2);
  316.                 }
  317.             }
  318.         return;
  319.     }
  320.  
  321.     int res[3];
  322.     int pivs[3];
  323.        
  324.     pickapivo(v, tam, 3, pivs);
  325.    
  326.     partition3(v, tam, pivs[0], pivs[1], pivs[2], res);
  327.  
  328.     Quicksort3(v, res[0]);
  329.     Quicksort3(v + res[0]+1, res[1] - res[0] - 1);
  330.     Quicksort3(v + res[1]+1, res[2] - res[1] - 1 );
  331.     Quicksort3(v + res[2]+1, tam - res[2] - 1);
  332. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement