快速排序,归并,堆 ,STL

  1. 欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611 
  2. // by MoreWindows( http://blog.csdn.net/MoreWindows )  
  3. #include <cstdio>  
  4. #include <algorithm>  
  5. #include <ctime>  
  6. using namespace std;  
  7. //------------------------快速排序----------------------------  
  8. void quick_sort(int s[], int l, int r)  
  9. {  
  10.     if (l < r)  
  11.     {  
  12.         int i = l, j = r, x = s[l];  
  13.         while (i < j)  
  14.         {  
  15.             while(i < j && s[j] >= x) // 从右向左找第一个小于x的数  
  16.                 j--;    
  17.             if(i < j)   
  18.                 s[i++] = s[j];  
  19.   
  20.             while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数  
  21.                 i++;    
  22.             if(i < j)   
  23.                 s[j--] = s[i];  
  24.         }  
  25.         s[i] = x;  
  26.         quick_sort(s, l, i - 1); // 递归调用   
  27.         quick_sort(s, i + 1, r);  
  28.     }  
  29. }  
  30. //------------------------归并排序----------------------------  
  31. //将有二个有序数列a[first...mid]和a[mid...last]合并。  
  32. void mergearray(int a[], int first, int mid, int last, int temp[])  
  33. {  
  34.     int i = first, j = mid + 1;  
  35.     int m = mid,   n = last;  
  36.     int k = 0;  
  37.   
  38.     while (i <= m && j <= n)  
  39.     {  
  40.         if (a[i] < a[j])  
  41.             temp[k++] = a[i++];  
  42.         else  
  43.             temp[k++] = a[j++];  
  44.     }  
  45.   
  46.     while (i <= m)  
  47.         temp[k++] = a[i++];  
  48.   
  49.     while (j <= n)  
  50.         temp[k++] = a[j++];  
  51.   
  52.     for (i = 0; i < k; i++)  
  53.         a[first + i] = temp[i];  
  54. }  
  55. void mergesort(int a[], int first, int last, int temp[])  
  56. {  
  57.     if (first < last)  
  58.     {  
  59.         int mid = (first + last) / 2;  
  60.         mergesort(a, first, mid, temp);    //左边有序  
  61.         mergesort(a, mid + 1, last, temp); //右边有序  
  62.         mergearray(a, first, mid, last, temp); //再将二个有序数列合并  
  63.     }  
  64. }  
  65. bool MergeSort(int a[], int n)  
  66. {  
  67.     int *p = new int[n];  
  68.     if (p == NULL)  
  69.         return false;  
  70.     mergesort(a, 0, n - 1, p);  
  71.     return true;  
  72. }  
  73. //------------------------堆排序---------------------------  
  74. inline void Swap(int &a, int &b)  
  75. {  
  76.     int c = a;  
  77.     a = b;  
  78.     b = c;  
  79. }  
  80. //建立最小堆  
  81. //  从i节点开始调整,n为节点总数 从0开始计算 i节点的子节点为 2*i+1, 2*i+2  
  82. void MinHeapFixdown(int a[], int i, int n)  
  83. {  
  84.     int j, temp;  
  85.   
  86.     temp = a[i];  
  87.     j = 2 * i + 1;  
  88.     while (j < n)  
  89.     {  
  90.         if (j + 1 < n && a[j + 1] < a[j]) //在左右孩子中找最小的  
  91.             j++;  
  92.   
  93.         if (a[j] >= temp)  
  94.             break;  
  95.   
  96.         a[i] = a[j];     //把较小的子结点往上移动,替换它的父结点  
  97.         i = j;  
  98.         j = 2 * i + 1;  
  99.     }  
  100.     a[i] = temp;  
  101. }  
  102. //建立最小堆  
  103. void MakeMinHeap(int a[], int n)  
  104. {  
  105.     for (int i = n / 2 - 1; i >= 0; i--)  
  106.         MinHeapFixdown(a, i, n);  
  107. }  
  108. void MinheapsortTodescendarray(int a[], int n)  
  109. {  
  110.     for (int i = n - 1; i >= 1; i--)  
  111.     {  
  112.         Swap(a[i], a[0]);  
  113.         MinHeapFixdown(a, 0, i);  
  114.     }  
  115. }  
  116. const int MAXN = 5000000;  
  117. int a[MAXN];  
  118. int b[MAXN], c[MAXN], d[MAXN];  
  119. int main()  
  120. {  
  121.     int i;  
  122.     srand(time(NULL));  
  123.     for (i = 0; i < MAXN; ++i)  
  124.         a[i] = rand() * rand(); //注rand()产生的数在0到0x7FFF之间  
  125.   
  126.     for (i = 0; i < MAXN; ++i)  
  127.         d[i] = c[i] = b[i] = a[i];  
  128.   
  129.     clock_t ibegin, iend;  
  130.   
  131.     printf("--当前数据量为%d--By MoreWindows(http://blog.csdn.net/MoreWindows)--\n", MAXN);  
  132.     //快速排序  
  133.     printf("快速排序:  ");  
  134.     ibegin = clock();  
  135.     quick_sort(a, 0, MAXN - 1);  
  136.     iend = clock();  
  137.     printf("%d毫秒\n", iend - ibegin);  
  138.   
  139.       
  140.     //归并排序  
  141.     printf("归并排序:  ");  
  142.     ibegin = clock();  
  143.     MergeSort(b, MAXN);  
  144.     iend = clock();  
  145.     printf("%d毫秒\n", iend - ibegin);  
  146.   
  147.     //堆排序  
  148.     printf("堆排序:  ");  
  149.     ibegin = clock();  
  150.     MakeMinHeap(c, MAXN);  
  151.     MinheapsortTodescendarray(c, MAXN);  
  152.     iend = clock();  
  153.     printf("%d毫秒\n", iend - ibegin);  
  154.   
  155.     //STL中的堆排序  
  156.     printf("STL中的堆排序: ");     
  157.     ibegin = clock();  
  158.     make_heap(d, d + MAXN);  
  159.     sort_heap(d, d + MAXN);  
  160.     iend = clock();  
  161.     printf("%d毫秒\n", iend - ibegin);  
  162.     return 0;  
  163. }  


详细请看

你可能感兴趣的:(C++,c)