Share Pastebin
Guest
Public paste!

Untitled

By: a guest | Mar 22nd, 2010 | Syntax: C | Size: 6.29 KB | Hits: 30 | Expires: Never
Copy text to clipboard
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4. #include <limits.h>
  5.  
  6. #define F_RANDOM 0
  7. #define F_CONSTANT 1
  8. #define F_ASC 3
  9. #define F_DESC 4
  10. #define F_ASCDESC 5
  11. #define F_DESCASC 6
  12.  
  13. void fillTable(int* tab, unsigned int size,  int type)
  14. {
  15.      int i, j, x;
  16.      x=0;
  17.      
  18.      switch(type)
  19.      {
  20.                  case F_RANDOM:
  21.                       srand( (unsigned)time(NULL));
  22.                       for(i=0; i<size; i++)
  23.                       {
  24.                          tab[i] = rand()%50;
  25.                       }
  26.                       break;
  27.                      
  28.                  case F_CONSTANT:
  29.                       for(i=0; i<size; i++)
  30.                       {
  31.                          tab[i] = 0;
  32.                       }
  33.                       break;
  34.                      
  35.                  case F_ASC:
  36.                       for(i=0; i<size; i++)
  37.                       {
  38.                          tab[i] = i;
  39.                       }
  40.                       break;
  41.                      
  42.                  case F_DESC:
  43.                       for(i=0; i<size; i++)
  44.                       {
  45.                           tab[i] = size-i;
  46.                       }
  47.                       break;
  48.                  case F_ASCDESC:
  49.                       for(i=0; i<size/2; i++)
  50.                       {
  51.                           tab[i] = 2*i+1;
  52.                       }
  53.                      
  54.                       for(i=size/2; i<size; i++)
  55.                       {
  56.                           tab[i] = 2*(size-1-i);
  57.                       }
  58.                       break;
  59.                  case F_DESCASC: // TODO
  60.                       x = size/2;
  61.                       for(i=0; i<size/2; i++)
  62.                       {
  63.                           tab[i] =  2*(size-1-x);
  64.                           x++;
  65.                          
  66.                       }
  67.                       x = 0;
  68.                       for(i=size/2; i<size; i++)
  69.                       {
  70.                           tab[i] = 2*x+1;
  71.                           x++;
  72.                       }
  73.                       break;
  74.      }
  75. }
  76.  
  77.  
  78. void ShellSort(int* tab, int n)
  79. {
  80.      int buf, i,  j, jump = 1;
  81.      while ( jump < n )
  82.      {
  83.            jump = 3*jump + 1;
  84.      }
  85.      while(jump > 0)
  86.      {
  87.                 for( i = jump; i<n; i++)
  88.                 {
  89.                      buf = tab[i];
  90.                      for(j=i-jump; j>=0 && buf < tab[j]; j-=jump)
  91.                      {
  92.                                    tab[j+jump] = tab[j];
  93.                      }
  94.                      tab[j+jump] = buf;
  95.                 }
  96.                 jump /= 3;
  97.      }
  98. }
  99.  
  100. /*void countingSort(int* tab, int n)
  101. {
  102.      int i, max = tab[0];
  103.      unsigned int sum;
  104.      for(i=1; i<n; i++)
  105.      {
  106.               if(tab[i] > max)
  107.                  max = tab[i];
  108.      }
  109.      max += 1;
  110.      
  111.      int* B = (int*)malloc(max*sizeof(int));
  112.      int* C = (int*)malloc((max)*sizeof(int));
  113.      int* D = (int*)malloc(n*sizeof(int));
  114.      
  115.      for(i=0; i<max; i++)
  116.      {
  117.        B[i] = 0;
  118.        C[i] = 0;
  119.        D[i] = 0;
  120.      }
  121.  
  122.      for(i=0; i<n; i++)
  123.      {
  124.        B[tab[i]]++;
  125.      }
  126.      sum = B[0];
  127.      for(i=1; i<max; i++)
  128.      {
  129.               C[i] = sum + B[i];
  130.               sum+= B[i];
  131.              
  132.               printf("%d ", C[i]);
  133.      }
  134.      
  135.      
  136.      for( i= n-1; i>=0; i--)
  137.      {
  138.           C[tab[i]] // todo
  139.      }
  140.      
  141.      
  142.      
  143.      free(B);
  144.      free(C);
  145.      free(D);
  146. }
  147.     */
  148. // 2001-cs-1902.. Rao Hammad Aslam... Counting Sort algo
  149.  
  150.  
  151. void count_sort( int* arr, int n)
  152.   {    
  153.                  
  154.      int i;
  155.      int max = arr[0];
  156.      for(i = 0; i<= n; i++)
  157.          if( max < arr[i] )
  158.              max = arr[i];
  159.    
  160.     int *temp;
  161.     temp = (int*)malloc(max*sizeof(int));
  162.    
  163.     for ( i = 0; i<= max; i++)
  164.       temp[i] = 0;
  165.      
  166.     for (i = 0; i<= n; i++)
  167.         temp[arr[i]] =temp[arr[i]] + 1;
  168.     // Step 4: Change the elements of the new array to be the Cumulative Sum
  169.      
  170.      for (i = 1; i<= max; i++)
  171.                  temp[i] = temp[i - 1] + temp[i];
  172.    
  173.    
  174.     // Step 5:
  175.     //       - Make another array of size similar to A:
  176.     //       - Start with the last element of A.. and place it at the
  177.     //        location of new array B which is mentioned in array temp.
  178.     int *new_arr;
  179.    
  180.     new_arr = (int*)malloc(n*sizeof(int));
  181.      // initialize new array  
  182.         for ( i = n; i>=0; i-- )
  183.         new_arr[i] = 0;
  184.    
  185.     for ( i = n; i>=0; i--)
  186.         {// place the element in the required location
  187.                 new_arr[ temp[ arr[i] ] - 1] = arr[i];
  188.         // decrement the frequency of element! to record that it has been placed one time
  189.             temp[arr[i]] = temp[arr[i]] - 1;
  190.    }
  191.  // Step 6: Copy the new_arr[] which is now sorted into the actual array:
  192.     for( i=0; i<=n; i++)
  193.            arr[i] = new_arr[i];
  194.  }
  195.      
  196.  
  197.  
  198.  
  199. int main()
  200. {
  201.     // ------------TEST--------------------------
  202.     srand((unsigned)time(NULL));
  203.    
  204.     unsigned long int i;
  205.     LARGE_INTEGER ticksPerSecond, tick, start_ticks, end_ticks, cputime;
  206.     if(!QueryPerformanceFrequency(&ticksPerSecond))
  207.       exit(1);                                        
  208.      
  209.      const int k = 17;
  210.      
  211.      int* tab = (int*)malloc(k*sizeof(int));
  212.      fillTable(tab, k, F_RANDOM);
  213.      
  214.      for(i=0; i<k; i++) printf("%d ", tab[i]);
  215.      
  216.      printf("\n------------------------\n");
  217.      
  218.      
  219.      count_sort(tab, k-1);
  220.      for(i=0; i<k; i++) printf("%d ", tab[i]);
  221.      
  222.      printf("\n------------------------\n");
  223.      
  224.      //countingSort(tab, 20);
  225.      system("pause");
  226.        
  227.    
  228.    
  229.     FILE *fp;
  230.    
  231.    
  232.    
  233.     if((fp=fopen("testy.txt", "w")) == NULL) { printf("Error"); exit(1); }
  234.    
  235.    
  236.     for(i=10000; i<=1000000; i+=5000)
  237.     {
  238.        int* tab = (int*)malloc(i*sizeof(int));
  239.        fillTable(tab, i, F_RANDOM);
  240.        
  241.        
  242.        QueryPerformanceCounter(&start_ticks);
  243.        ShellSort(tab, i);
  244.        QueryPerformanceCounter(&end_ticks);
  245.        printf("%lu\n", i);
  246.        cputime.QuadPart = end_ticks.QuadPart - start_ticks.QuadPart;
  247.        
  248.        fprintf(fp, "%10.9f\n", ((float)cputime.QuadPart/(float)ticksPerSecond.QuadPart));
  249.        free(tab);
  250.     }
  251.    
  252.    
  253.     fclose(fp);
  254.  
  255.     // ------------TEST--------------------------
  256.    
  257.    
  258.     return 0;
  259. }