Advertisement
Raul_julian

TP2

Dec 17th, 2016
375
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.79 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <string.h>
  5. #define MAX_LENGTH_OPTIONS 3
  6. #define MAX_OPTIONS 8
  7. //Define the options of functions sorting
  8. char optionSorting[MAX_OPTIONS][MAX_LENGTH_OPTIONS + 1] = {
  9.     "Bub",
  10.     "Sel",
  11.     "Ins",
  12.     "She",
  13.     "Qui",
  14.     "Hea",
  15.     "Mer",
  16.     "Rad"
  17. };
  18.  
  19. void bubble_sort(int *vetor, int length) {
  20.  
  21.   int aux, y, x;
  22.  
  23.   for( x = 0; x < length; x++ )
  24.   {
  25.     for( y = x + 1; y < length; y++ )
  26.     {
  27.       if ( vetor[x] > vetor[y] )
  28.       {
  29.          aux = vetor[x];
  30.          vetor[x] = vetor[y];
  31.          vetor[y] = aux;
  32.       }
  33.     }
  34.   }
  35.  
  36. }
  37.  
  38. void selection_sort(int *vetor,int length) {
  39.   int i, j, min, aux;
  40.  
  41.   for (i = 0; i < (length - 1); i++) {
  42.     min = i;
  43.     for (j = i+1; j < length; j++) {
  44.       if (vetor[j] < vetor[min]) {
  45.    min = j;
  46.       }
  47.     }
  48.     if (i != min) {
  49.       aux = vetor[i];
  50.       vetor[i] = vetor[min];
  51.       vetor[min] = aux;
  52.     }
  53.   }
  54. }
  55.  
  56. void insertion_sort(int *vetor, int length) {
  57.    int i, j, nowvalueue;
  58.  
  59.    for( j=1; j < length; j++ )
  60.    {
  61.       nowvalueue = vetor[j];
  62.       i = j-1;
  63.      
  64.       while(i >= 0 && vetor[i] > nowvalueue)
  65.       {
  66.         vetor[i+1] = vetor[i];
  67.         i--;
  68.       }          
  69.       vetor[i+1] = nowvalueue;
  70.    }
  71. }
  72.  
  73. void shell_sort(int *vetor, int length) {
  74.    int i , j , valueue;
  75.     int blank = 1;
  76.    
  77.     do {
  78.         blank = 3*blank+1;
  79.     } while(blank < length);
  80.    
  81.     do {
  82.         blank /= 3;
  83.         for(i = blank; i < length; i++) {
  84.             valueue = vetor[i];
  85.             j = i - blank;
  86.            
  87.             while (j >= 0 && valueue < vetor[j]) {
  88.                 vetor[j + blank] = vetor[j];
  89.                 j -= blank;
  90.             }
  91.             vetor[j + blank] = valueue;
  92.         }
  93.     } while(blank > 1);
  94. }
  95.  
  96. void quick_sort(int *vetor, int start, int end) {
  97.    
  98.    int pivo, aux, i, j, medium;
  99.    
  100.    i = start;
  101.    j = end;
  102.    
  103.    medium = (int) ((i + j) / 2);
  104.    pivo = vetor[medium];
  105.    
  106.    do{
  107.       while (vetor[i] < pivo) i = i + 1;
  108.       while (vetor[j] > pivo) j = j - 1;
  109.      
  110.       if(i <= j){
  111.          aux = vetor[i];
  112.          vetor[i] = vetor[j];
  113.          vetor[j] = aux;
  114.          i = i + 1;
  115.          j = j - 1;
  116.       }
  117.    } while(j > i);
  118.    
  119.    if(start < j) quick_sort(vetor, start, j);
  120.    if(i < end) quick_sort(vetor, i, end);  
  121.  
  122. }
  123.  
  124. void heap_start(int *vetor, int length)
  125. {
  126.     int i, value, aux, alt ;
  127.     for ( i = 1 ; i < length ; i++ )
  128.     {
  129.         value = vetor[i] ;
  130.         aux = i ;
  131.         alt = ( aux - 1 ) / 2 ;
  132.         while ( aux > 0 && vetor[alt] < value )
  133.         {
  134.             vetor[aux] = vetor[alt] ;
  135.             aux = alt ;
  136.             alt = ( aux - 1 ) / 2 ;
  137.         }
  138.         vetor[aux] = value ;
  139.     }
  140. }
  141.  
  142. void heap_sort(int *vetor, int length)
  143. {
  144.     int i, aux, alt, endvalue ;
  145.     for ( i = length - 1 ; i > 0 ; i-- )
  146.     {
  147.         endvalue = vetor[i] ;
  148.         vetor[i] = vetor[0] ;
  149.         alt = 0 ;
  150.  
  151.         if ( i == 1 )
  152.             aux = -1 ;
  153.         else
  154.             aux = 1 ;
  155.  
  156.         if ( i > 2 && vetor[2] > vetor[1] )
  157.             aux = 2 ;
  158.  
  159.         while ( aux >= 0 && endvalue < vetor[aux] )
  160.         {
  161.             vetor[alt] = vetor[aux] ;
  162.             alt = aux ;
  163.             aux = 2 * alt + 1 ;
  164.  
  165.             if ( aux + 1 <= i - 1 && vetor[aux] < vetor[aux + 1] )
  166.                 aux++ ;
  167.             if ( aux > i - 1 )
  168.                 aux = -1 ;
  169.         }
  170.         vetor[alt] = endvalue ;
  171.     }
  172. }
  173.  
  174. void merging(int *vetor, int *vetAux, int min, int middle, int high) {
  175.    int varOne, varTwo, i;
  176.  
  177.    for(varOne = min, varTwo = middle + 1, i = min; varOne <= middle && varTwo <= high; i++) {
  178.       if(vetor[varOne] <= vetor[varTwo])
  179.          vetAux[i] = vetor[varOne++];
  180.       else
  181.          vetAux[i] = vetor[varTwo++];
  182.    }
  183.    
  184.    while(varOne <= middle)    
  185.       vetAux[i++] = vetor[varOne++];
  186.  
  187.    while(varTwo <= high)  
  188.       vetAux[i++] = vetor[varTwo++];
  189.  
  190.    for(i = min; i <= high; i++)
  191.       vetor[i] = vetAux[i];
  192. }
  193.  
  194. void merge_sort(int *vetor, int *vetAux, int min, int high) {
  195.    int middle;
  196.    
  197.    if(min < high) {
  198.       middle = (min + high) / 2;
  199.       merge_sort(vetor, vetAux, min, middle);
  200.       merge_sort(vetor, vetAux, middle+1, high);
  201.       merging(vetor, vetAux, min, middle, high);
  202.    } else return ;
  203. }
  204.  
  205. int searchBiggest(int * vetor, int length){
  206.  
  207.   int i;
  208.   int bigNb = -1;
  209.  
  210.   for(i = 0; i < length; i++){
  211.     if(vetor[i] > bigNb)
  212.       bigNb = vetor[i];
  213.   }
  214.  
  215.   return bigNb;
  216. }
  217.  
  218. // Radix Sort
  219. void radix_sort(int * vetor, int length){
  220.  
  221.   int i, percentedSort[length], sDigit = 1;
  222.   int bigNb = searchBiggest(vetor, length);
  223.  
  224.   while (bigNb / sDigit > 0){
  225.    
  226.     int couple[10] = { 0 };
  227.    
  228.     for (i = 0; i < length; i++)
  229.       couple[(vetor[i] / sDigit) % 10]++;
  230.    
  231.     for (i = 1; i < 10; i++)
  232.       couple[i] += couple[i - 1];
  233.    
  234.     for (i = length - 1; i >= 0; i--)
  235.       percentedSort[--couple[(vetor[i] / sDigit) % 10]] = vetor[i];
  236.    
  237.    
  238.     for (i = 0; i < length; i++)
  239.       vetor[i] = percentedSort[i];
  240.    
  241.     sDigit *= 10;
  242.   }
  243. }
  244.  
  245. void redefines_vet(int *vet, int length) {
  246.     int i ;
  247.  
  248.     for(i = 0; i < length; i++)
  249.         vet[i] = (rand() % length);
  250. }
  251.  
  252. void printVet(int *vet, int length) {
  253.     int i ;
  254.  
  255.     for(i = 0; i < length; i++)
  256.         printf("vet[%d]: %d\n", i, vet[i]);
  257. }
  258.  
  259. int main(int argc, char *argv[]) {
  260.  
  261.     int length, i, choise;
  262.     int *vet ;
  263.     int print = 0 ;
  264.     clock_t start, finish ;
  265.  
  266.     if(argc != 3 && argc != 4 && argc != 5) {
  267.       printf("\nPARAMETER NOT ENTERED CORRECTLY!\n");
  268.       return 0 ;
  269.     } else if(argc == 4)
  270.         print = 1;  
  271.  
  272.     //Catch length of vector
  273.     length = atoi(argv[2]);
  274.  
  275.     //malloc memory for vector
  276.     vet = (int *) malloc(sizeof(int) * length);  
  277.  
  278.     //Insert in vector with round numbers
  279.     redefines_vet(vet, length);
  280.  
  281.     //Start Time Sorting
  282.     start = clock();
  283.  
  284.     printf("PARAM:%s as\n", argv[1]);
  285.  
  286.     //Select choise
  287.     for(i = 0; i < MAX_OPTIONS; i++) {
  288.         if(strcmp(optionSorting[i], argv[1]) == 0) {
  289.             choise = ++i;
  290.             break ;
  291.         }
  292.     }
  293.  
  294.     //Print or Not
  295.     if(print) {
  296.         printf("VECTOR NOT ORDENED");
  297.         printVet(vet, length);
  298.     }
  299.  
  300.  
  301.     switch(choise) {
  302.  
  303.         case 1: {
  304.             printf("\nBUBBLE SORT\n");
  305.             bubble_sort(vet, length);
  306.         } break ;
  307.  
  308.         case 2: {
  309.             printf("\nSELECTION SORT\n");
  310.             selection_sort(vet, length);
  311.         } break ;
  312.  
  313.         case 3: {
  314.             printf("\nINSERTION SORT\n");
  315.             insertion_sort(vet, length);
  316.         } break ;
  317.  
  318.         case 4: {
  319.             printf("\nSHELL SORT\n");
  320.             shell_sort(vet, length);
  321.         } break ;
  322.  
  323.         case 5: {
  324.             printf("\nQUICK SORT\n");
  325.             quick_sort(vet, 0, length);
  326.         } break ;
  327.  
  328.         case 6: {
  329.             printf("\n\nHEAP SORT\n");
  330.             heap_start(vet, length);
  331.             heap_sort(vet, length);
  332.         } break ;
  333.  
  334.         case 7: {
  335.             printf("\n\nMERGE SORT\n");
  336.             int *vetAux = (int *) malloc(sizeof(int) * length);
  337.             merge_sort(vet, vetAux, 0, length);
  338.         } break ;
  339.  
  340.         case 8: {
  341.             printf("\n\nRADIX SORT\n");
  342.             radix_sort(vet, length);
  343.         } break ;
  344.        
  345.         default: {
  346.             printf("\nPARAMETER NOT FOUND!\n");
  347.         } break ;
  348.     }
  349.    
  350.     finish = clock();
  351.     printf("IT TOOK %lf SECONDS TO EXECUTE.\n", (((double)(finish - start)) / CLOCKS_PER_SEC));
  352.    
  353.     //Print or Not
  354.     if(print) {
  355.         printf("VECTOR ORDENED");
  356.         printVet(vet, length);
  357.     }
  358.  
  359.     return 0 ;
  360. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement