RenHao

Sorting Practice

May 17th, 2017
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.03 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5. //#include <math.h>
  6.  
  7. #define MAX_SIZE 100
  8. #define SWAP(x,y,t)((t)=(x), (x)=(y), (y)=(t))
  9.  
  10. /* Sort functions decalaration */
  11. /* Quick Sort */
  12. void QuickSort(int a[],int left,int right);
  13.  
  14. /* Merge Sort */
  15. void mergesort_new(int list[], int temp[],int left, int right);
  16. int listMerge(int a[], int link[], int start1, int start2);
  17. int reMergeSort(int a[],int link[], int left, int right);
  18. void Merge(int initlist[], int mergedlist[], int head, int middle, int tail);
  19. void MergePass(int initlist[], int mergedlist[], int n, int size);
  20. void MergeSort(int a[],int n);
  21.  
  22. /* Heap Sort */
  23. void Heap_Construct(int list[],int n);
  24. void Heap_Adjust(int list[],int n,int i);
  25. void Heap_Sort(int list[],int n);
  26.  
  27. /* Others */
  28. void printAry(int a[],int left, int length);
  29. void Intro(void);
  30. void chooseSort(unsigned int num , int a[] , int arySz);
  31.  
  32. int main(int argc, const char * argv[])
  33. {
  34.     /* Variable decalre */
  35.     int Data_input;
  36.     static int temp,i;
  37.     int *userAry;
  38.  
  39.     Intro();
  40.     while(1)
  41.     {
  42.     printf("Please decide how to input data\n");
  43.     printf("Enter by yourself  for 1\n");
  44.     printf("Generate in random for 2\n");
  45.     scanf("%d",&Data_input);
  46.  
  47.        
  48.         printf("Enter how many integers you want to input: ");
  49.         scanf("%d",&temp);
  50.         if((userAry = malloc(sizeof(int)*temp)) == NULL)
  51.         {
  52.             printf("Error allocating memory!\n");
  53.             exit(EXIT_FAILURE);
  54.         }
  55.        
  56.     switch (Data_input) {
  57.         case 1:
  58. //            printf("Enter how many integers you want to input: ");
  59. //            scanf("%d",&temp);
  60. //            if((userAry = malloc(sizeof(int)*temp)) == NULL)
  61. //            {
  62. //                printf("Error allocating memory!\n");
  63. //                exit(EXIT_FAILURE);
  64. //            }
  65.             printf("Enter your data : ");
  66.             for(i=0 ; i<temp ; i++)
  67.                 scanf("%d",&userAry[i]);
  68. //            printf("Which sort do you want to do : ");
  69. //            scanf("%1d",&i);
  70. //            chooseSort(i, userAry, temp);
  71.             break;
  72.  
  73.         case 2:
  74.            
  75.             srand((unsigned int)time(NULL));
  76.             for(i=0 ; i<temp ; i++)
  77.             {
  78.                 userAry[i] = ((rand() * i +99) % 1024) + 1;
  79.             }
  80.            
  81.             break;
  82.         default:
  83.             break;
  84.     }
  85.         printf("Which sort do you want to do : ");
  86.         scanf("%1d",&i);
  87.         chooseSort(i, userAry, temp);
  88.         free(userAry);
  89.     }
  90.     //int ary[8] = {8,4,5,6,2,1,7,4};
  91.     //int temp[8];
  92.     //int ary[8] = {1,2,3,4,5,6,7,8};
  93.     //int link[8] = {0};
  94.     //printAry(ary,0, 8);
  95.     //QuickSort(ary, 0, 7);
  96.     //mergesort_new(ary, link, 0, 7);
  97.     //Heap_Sort(ary, 8);
  98.     //printAry(ary,0, 8);
  99.     return 0;
  100. }
  101.  
  102. /* Heap Sort */
  103. void Heap_Construct(int list[],int n)
  104. {
  105.     int i;
  106.     for(i=n/2-1; i>=0; i--)
  107.         Heap_Adjust(list, n, i);
  108. }
  109.  
  110. void Heap_Adjust(int list[],int n,int i)
  111. {
  112.     int temp,large;
  113.     temp = list[i];
  114.     while(2*i+1 < n)
  115.     {
  116.         large = 2*i+1;
  117.         if((large+1)<n && list[large]<list[large+1])
  118.             large++;
  119.         if(temp >= list[large])
  120.             break;
  121.         list[i] = list[large];
  122.         i=large;
  123.     }
  124.     list[i] = temp;
  125. }
  126.  
  127. void Heap_Sort(int list[],int n)
  128. {
  129.     int temp;
  130.     Heap_Construct(list, n);
  131.     while (n>1)
  132.     {
  133.         temp = list[0];
  134.         list[0] = list[n-1];
  135.         list[n-1] = temp;
  136.         n--;
  137.         Heap_Adjust(list, n, 0);
  138.     }
  139. }
  140.  
  141. /* Quick Sort */
  142. void QuickSort(int a[],int left,int right)
  143. {
  144.     int pivot,i,j,temp=0;
  145.     if(left < right)
  146.     {
  147.         i = left ; j = right + 1;
  148.         pivot = a[left];
  149.         //printf("init pivot = %d i=%d j=%d\n",pivot,i,j);
  150.         do
  151.         {
  152.             do i++; while(a[i] < pivot && i<right);
  153.             do j--; while(a[j] > pivot && j>left);
  154.            // printf("[i=%d , j=%d]\n",i,j);
  155.             if (i<j) SWAP(a[i],a[j],temp);
  156.            // printAry(a, left,right+1);
  157.         } while (i<j);
  158.         SWAP(a[left],a[j],temp);
  159.         //printAry(a, left, right+1);
  160.         QuickSort(a, left, j-1);
  161.         QuickSort(a, j+1, right);
  162.     }
  163. }
  164.  
  165. /* Merge Sort */
  166. void mergesort_new(int list[], int temp[],int left, int right)
  167. {
  168.     int middle,i,j,k,n;
  169.  
  170.     if(left < right)
  171.     {
  172.         middle = (left+right)/2;
  173.         mergesort_new(list, temp, left, middle);
  174.         mergesort_new(list, temp, middle+1, right);
  175.  
  176.         i=left;
  177.         j=middle+1;
  178.         k=left;
  179.         n=right-left+1;
  180.  
  181.         while(i <= middle && j <= right)
  182.             if(list[i] <= list[j])  temp[k++] = list[i++];
  183.             else                    temp[k++] = list[j++];
  184.  
  185.         while(i <= middle)
  186.             temp[k++] = list[i++];
  187.         while(j <= right)
  188.             temp[k++] = list[j++];
  189.         for(i=0; i<n; i++,right--)
  190.             list[right] = temp[right];
  191.         //printAry(list, 0, 8);
  192.     }
  193. }
  194. /*
  195. int listMerge(int a[], int link[], int start1, int start2)
  196. {
  197.     int last1,last2,lastResult = 0;
  198.     for(last1 = start1 , last2 = start2; last1 && last2; )
  199.         if(a[last1] <= a[last2])
  200.         {
  201.             link[lastResult] = last1;
  202.             lastResult = last1; last1 = link[last1];
  203.         }
  204.         else
  205.         {
  206.             link[lastResult] = last2;
  207.             lastResult = last2; last2 = link[last2];
  208.         }
  209.  
  210.     if(last1 == 0) link[lastResult] = last2;
  211.     else    link[lastResult] = last1;
  212.     return link[0];
  213. }
  214.  
  215. int reMergeSort(int a[],int link[], int left, int right)
  216. {
  217.     if(left >= right)   return left;
  218.     int mid = (left+right)/2;
  219.     return listMerge(a, link, reMergeSort(a, link, left, mid), reMergeSort(a, link, mid+1, right));
  220. }
  221.  
  222. void Merge(int initlist[], int mergedlist[], int head, int middle, int tail)
  223. {
  224.     int j,k,l,t;
  225.     j = middle + 1;
  226.     k = head;   l = head;
  227.     // Put element into mergedlist
  228.     while( k<=middle && j<=tail)
  229.     {
  230.         if( initlist[k] < initlist[j] )
  231.             mergedlist[l++] = initlist[k++];
  232.         else
  233.             mergedlist[l++] = initlist[j++];
  234.     }
  235.  
  236.     if(k>middle)
  237.         for(t=j; t<=tail; t++)
  238.             mergedlist[t] = initlist[t];
  239.     else
  240.         for(t=k; t<=middle; t++)
  241.             mergedlist[t] = initlist[t];
  242. }
  243.  
  244. void MergePass(int initlist[], int mergedlist[], int n, int size)
  245. {
  246.     int i,j;
  247.     for( i=1; i<=n-2*size+1; i+=2*size )
  248.         Merge(initlist, mergedlist, i, i+size-1, i+2*size-1);
  249.     if( (i+size-1) < n )
  250.         Merge(initlist, mergedlist, i, i+size-1, n);
  251.     else
  252.         for(j=i; j<=n; j++)
  253.             mergedlist[j] = initlist[j];
  254. }
  255.  
  256. void MergeSort(int a[],int n)
  257. {
  258.     int size=1;
  259.     int extra[MAX_SIZE];
  260.     while(size < n)
  261.     {
  262.         MergePass(a, extra, n, size);
  263.         size*=2;
  264.         MergePass(extra, a, n, size);
  265.         size*=2;
  266.     }
  267. }
  268. */
  269. /* Others */
  270. void Intro(void)
  271. {
  272.     printf("Welcome to use the Sorting System\n");
  273.     printf("There are three different ways to sort your data\n");
  274.     printf("1.Quick Sort\n");
  275.     printf("2.Merge Sort\n");
  276.     printf("3.Heap  Sort\n");
  277.     printf("And you can input your own data\n");
  278.     printf("Or we can generate if randomly\n");
  279.     printf("So.... Let's start!\n\n");
  280. }
  281.  
  282. void printAry(int a[],int left,int length)
  283. {
  284.     int i = left;
  285.     printf("Output : \n");
  286.     for (; i<length ; i++)
  287.         printf("%d ",a[i]);
  288.     printf("\n");
  289. }
  290.  
  291. void chooseSort(unsigned int num , int a[] , int arySz)
  292. {
  293.     int *tempAry;
  294.     tempAry = malloc(sizeof(int) * arySz);
  295.     if((tempAry = malloc(sizeof(int)*arySz)) == NULL)
  296.     {
  297.         printf("Error allocating memory!\n");
  298.         exit(EXIT_FAILURE);
  299.     }
  300.     printAry(a, 0, arySz);
  301.     switch (num) {
  302.         case 1:
  303.             QuickSort(a, 0, arySz);
  304.             break;
  305.         case 2:
  306.             mergesort_new(a, tempAry, 0, arySz);
  307.             break;
  308.         case 3:
  309.             Heap_Sort(a, arySz);
  310.             break;
  311.         default:
  312.             break;
  313.     }
  314.     printAry(a, 0, arySz);
  315. }
Advertisement
Add Comment
Please, Sign In to add comment