RenHao

DS_HW2

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