当前位置:   article > 正文

【C++】快速排序 QuickSort的实现及其两种优化方法-双路快速排序法、三路快速排序法_快速排序cpp

快速排序cpp

一,第一种实现方法 - 基本法(递归)

(1)基本思路

如下面数组:

 

将第一个元素4移动到中间,在4的左边为小于4的元素,在4的右边为大于4的元素:

(2)基本实现思路

我们进行一个分区(分部)操作:

 

 

 

 

①当e> v,则i ++:

 

 

②当e <v,则

             j ++;
            交换(arr [j],arr [i]);

 

 

然后我++,进行下一步 

直到i> n - 1,遍历数组结束:

 

 ③最后,交换(arr [l],arr [j]);

(3)完整的实现代码:

  1. // 对arr[l...r]部分进行partition操作
  2. // 返回p, 使得arr[l...p-1] < arr[p] ; arr[p+1...r] > arr[p]
  3. template <typename T>
  4. int __partition(T arr[], int l, int r){
  5. T v = arr[l];
  6. int j = l; // arr[l+1...j] < v ; arr[j+1...i) > v
  7. for( int i = l + 1 ; i <= r ; i ++ )
  8. if( arr[i] < v ){
  9. j ++;
  10. swap( arr[j] , arr[i] );
  11. }
  12. swap( arr[l] , arr[j]);
  13. return j;
  14. }
  15. // 对arr[l...r]部分进行快速排序
  16. template <typename T>
  17. void __quickSort(T arr[], int l, int r){
  18. if( l >= r )
  19. return;
  20. int p = __partition(arr, l, r);
  21. __quickSort(arr, l, p-1 );
  22. __quickSort(arr, p+1, r);
  23. }
  24. template <typename T>
  25. void quickSort(T arr[], int n){
  26. __quickSort(arr, 0, n-1);
  27. }

(4)上面的方法有两种优化方法:

①优化方法1:对于小规模数组,使用插入排序进行优化

当元素个数小于16时,我们调用插入排序,

  1. if( r - l <= 15 ){
  2. insertionSort(arr,l,r);
  3. return;
  4. }

完整代码:

  1. // 对arr[l...r]部分进行partition操作
  2. // 返回p, 使得arr[l...p-1] < arr[p] ; arr[p+1...r] > arr[p]
  3. template <typename T>
  4. int _partition(T arr[], int l, int r){
  5. // 随机在arr[l...r]的范围中, 选择一个数值作为标定点pivot
  6. swap( arr[l] , arr[rand()%(r-l+1)+l] );
  7. T v = arr[l];
  8. int j = l;
  9. for( int i = l + 1 ; i <= r ; i ++ )
  10. if( arr[i] < v ){
  11. j ++;
  12. swap( arr[j] , arr[i] );
  13. }
  14. swap( arr[l] , arr[j]);
  15. return j;
  16. }
  17. // 对arr[l...r]部分进行快速排序
  18. template <typename T>
  19. void _quickSort(T arr[], int l, int r){
  20. // 对于小规模数组, 使用插入排序进行优化
  21. if( r - l <= 15 ){
  22. insertionSort(arr,l,r);
  23. return;
  24. }
  25. int p = _partition(arr, l, r);
  26. _quickSort(arr, l, p-1 );
  27. _quickSort(arr, p+1, r);
  28. }
  29. template <typename T>
  30. void quickSort(T arr[], int n){
  31. srand(time(NULL));
  32. _quickSort(arr, 0, n-1);
  33. }

插入排序代码:

  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4. template<typename T>
  5. void insertionSort(T arr[], int n){
  6. for( int i = 1 ; i < n ; i ++ ) {
  7. T e = arr[i];
  8. int j;
  9. for (j = i; j > 0 && arr[j-1] > e; j--)
  10. arr[j] = arr[j-1];
  11. arr[j] = e;
  12. }
  13. return;
  14. }
  15. // 对arr[l...r]范围的数组进行插入排序
  16. template<typename T>
  17. void insertionSort(T arr[], int l, int r){
  18. for( int i = l+1 ; i <= r ; i ++ ) {
  19. T e = arr[i];
  20. int j;
  21. for (j = i; j > l && arr[j-1] > e; j--)
  22. arr[j] = arr[j-1];
  23. arr[j] = e;
  24. }
  25. return;
  26. }

 

②优化方法2:随机化快速排序法

对于归并排序,每次进行分区操作都是对半分配:

对于快速排序,我们都是去第一个元素为中间值,这个值可能是最小值或最大值或任意大小值,导致分区操作分配不均:

 

当第一个元素为最小值时,出现快速排序最差的情况,变成了一个链表:

所以,我们应该在数组中随机选择一个数而非取第一个数,即随机在arr [l ... r]的范围中,选择一个数值作为标定点pivot:

  1. swap( arr[l] , arr[rand()%(r-l+1)+l] );
  2. T v = arr[l];

完整的实现代码:

  1. // 对arr[l...r]部分进行partition操作
  2. // 返回p, 使得arr[l...p-1] < arr[p] ; arr[p+1...r] > arr[p]
  3. template <typename T>
  4. int _partition(T arr[], int l, int r){
  5. // 随机在arr[l...r]的范围中, 选择一个数值作为标定点pivot
  6. swap( arr[l] , arr[rand()%(r-l+1)+l] );
  7. T v = arr[l];
  8. int j = l;
  9. for( int i = l + 1 ; i <= r ; i ++ )
  10. if( arr[i] < v ){
  11. j ++;
  12. swap( arr[j] , arr[i] );
  13. }
  14. swap( arr[l] , arr[j]);
  15. return j;
  16. }
  17. // 对arr[l...r]部分进行快速排序
  18. template <typename T>
  19. void _quickSort(T arr[], int l, int r){
  20. // 对于小规模数组, 使用插入排序进行优化
  21. if( r - l <= 15 ){
  22. insertionSort(arr,l,r);
  23. return;
  24. }
  25. int p = _partition(arr, l, r);
  26. _quickSort(arr, l, p-1 );
  27. _quickSort(arr, p+1, r);
  28. }
  29. template <typename T>
  30. void quickSort(T arr[], int n){
  31. srand(time(NULL));
  32. _quickSort(arr, 0, n-1);
  33. }

二,第二种实现方法 - 双路快速排序法

(1)回顾前面第一种方法的分区,在标定元素的两边的元素个数及其不平衡:

(2)所以,我们使用两个指针,同时判断:

       ①while(i <= r && arr [i] <v)
            i ++; 

直到e> = v时,停止:

 

②while(j> = l + 1 && arr [j]> v)
            j - ;

 

直到e <= v时停止:

 

 

 

 

(3)完整的实现代码:
 

  1. // 双路快速排序的partition
  2. // 返回p, 使得arr[l...p-1] < arr[p] ; arr[p+1...r] > arr[p]
  3. template <typename T>
  4. int _partition2(T arr[], int l, int r){
  5. // 随机在arr[l...r]的范围中, 选择一个数值作为标定点pivot
  6. swap( arr[l] , arr[rand()%(r-l+1)+l] );
  7. T v = arr[l];
  8. // arr[l+1...i) <= v; arr(j...r] >= v
  9. int i = l+1, j = r;
  10. while( true ){
  11. // 注意这里的边界, arr[i] < v, 不能是arr[i] <= v
  12. while( i <= r && arr[i] < v )
  13. i ++;
  14. // 注意这里的边界, arr[j] > v, 不能是arr[j] >= v
  15. while( j >= l+1 && arr[j] > v )
  16. j --;
  17. if( i > j )
  18. break;
  19. swap( arr[i] , arr[j] );
  20. i ++;
  21. j --;
  22. }
  23. swap( arr[l] , arr[j]);
  24. return j;
  25. }
  26. // 对arr[l...r]部分进行快速排序
  27. template <typename T>
  28. void _quickSort(T arr[], int l, int r){
  29. // 对于小规模数组, 使用插入排序进行优化
  30. if( r - l <= 15 ){
  31. insertionSort(arr,l,r);
  32. return;
  33. }
  34. // 调用双路快速排序的partition
  35. int p = _partition2(arr, l, r);
  36. _quickSort(arr, l, p-1 );
  37. _quickSort(arr, p+1, r);
  38. }
  39. template <typename T>
  40. void quickSort(T arr[], int n){
  41. srand(time(NULL));
  42. _quickSort(arr, 0, n-1);
  43. }

三,第三种实现方法 - 三路快速排序法

 (1)基本思路

将数组分成三个部分:大于标定点V,等于标定点V,小于标定点五:

小于标定点V在区间arr [l + 1 ... lt]:

大于标定点V在区间arr [gt ... r]:

等于标定点V在区间arr [lt + 1 ... i-1]:

遍历游标我:

①当e = v,i ++;

 

 

 ②当e <v,swap(arr [i],arr [lt + 1])

然后,

          i ++;
           lt ++; 

 ③当e> v:
swap(arr [i],arr [gt-1]);

 

 

 然后,gt - ;

当我<gt,完成遍历:

 

 

最后,交换(arr [l],arr [lt]);

 

 

(2)三路快速排序代码实现:

  1. // 递归的三路快速排序算法
  2. template <typename T>
  3. void __quickSort3Ways(T arr[], int l, int r){
  4. // 对于小规模数组, 使用插入排序进行优化
  5. if( r - l <= 15 ){
  6. insertionSort(arr,l,r);
  7. return;
  8. }
  9. // 随机在arr[l...r]的范围中, 选择一个数值作为标定点pivot
  10. swap( arr[l], arr[rand()%(r-l+1)+l ] );
  11. T v = arr[l];
  12. int lt = l; // arr[l+1...lt] < v
  13. int gt = r + 1; // arr[gt...r] > v
  14. int i = l+1; // arr[lt+1...i) == v
  15. while( i < gt ){
  16. if( arr[i] < v ){
  17. swap( arr[i], arr[lt+1]);
  18. i ++;
  19. lt ++;
  20. }
  21. else if( arr[i] > v ){
  22. swap( arr[i], arr[gt-1]);
  23. gt --;
  24. }
  25. else{ // arr[i] == v
  26. i ++;
  27. }
  28. }
  29. swap( arr[l] , arr[lt] );
  30. __quickSort3Ways(arr, l, lt-1);
  31. __quickSort3Ways(arr, gt, r);
  32. }
  33. template <typename T>
  34. void quickSort3Ways(T arr[], int n){
  35. srand(time(NULL));
  36. __quickSort3Ways( arr, 0, n-1);
  37. }

 四,测试用例

我们用一个n = 1000000个元素的随机数组,测试归并派速,二路快速排序和三路快速排序的所用的时间:yi

①main.cpp

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <ctime>
  4. #include "SortTestHelper.h"
  5. #include "MergeSort.h"
  6. #include "InsertionSort.h"
  7. #include "QuickSort.h"
  8. using namespace std;
  9. // 递归的三路快速排序算法
  10. template <typename T>
  11. void __quickSort3Ways(T arr[], int l, int r){
  12. // 对于小规模数组, 使用插入排序进行优化
  13. if( r - l <= 15 ){
  14. insertionSort(arr,l,r);
  15. return;
  16. }
  17. // 随机在arr[l...r]的范围中, 选择一个数值作为标定点pivot
  18. swap( arr[l], arr[rand()%(r-l+1)+l ] );
  19. T v = arr[l];
  20. int lt = l; // arr[l+1...lt] < v
  21. int gt = r + 1; // arr[gt...r] > v
  22. int i = l+1; // arr[lt+1...i) == v
  23. while( i < gt ){
  24. if( arr[i] < v ){
  25. swap( arr[i], arr[lt+1]);
  26. i ++;
  27. lt ++;
  28. }
  29. else if( arr[i] > v ){
  30. swap( arr[i], arr[gt-1]);
  31. gt --;
  32. }
  33. else{ // arr[i] == v
  34. i ++;
  35. }
  36. }
  37. swap( arr[l] , arr[lt] );
  38. __quickSort3Ways(arr, l, lt-1);
  39. __quickSort3Ways(arr, gt, r);
  40. }
  41. template <typename T>
  42. void quickSort3Ways(T arr[], int n){
  43. srand(time(NULL));
  44. __quickSort3Ways( arr, 0, n-1);
  45. }
  46. // 比较Merge Sort和双路快速排序和三路快排三种排序算法的性能效率
  47. // 对于包含有大量重复数据的数组, 三路快排有巨大的优势
  48. // 对于一般性的随机数组和近乎有序的数组, 三路快排的效率虽然不是最优的, 但是是在非常可以接受的范围里
  49. // 因此, 在一些语言中, 三路快排是默认的语言库函数中使用的排序算法。比如Java:)
  50. int main() {
  51. int n = 1000000;
  52. // 测试1 一般性测试
  53. cout<<"Test for random array, size = "<<n<<", random range [0, "<<n<<"]"<<endl;
  54. int* arr1 = SortTestHelper::generateRandomArray(n,0,n);
  55. int* arr2 = SortTestHelper::copyIntArray(arr1,n);
  56. int* arr3 = SortTestHelper::copyIntArray(arr1,n);
  57. SortTestHelper::testSort("Merge Sort", mergeSort, arr1, n);
  58. SortTestHelper::testSort("Quick Sort", quickSort, arr2, n);
  59. SortTestHelper::testSort("Quick Sort 3 Ways", quickSort3Ways, arr3, n);
  60. delete[] arr1;
  61. delete[] arr2;
  62. delete[] arr3;
  63. cout<<endl;
  64. // 测试2 测试近乎有序的数组
  65. int swapTimes = 100;
  66. cout<<"Test for nearly ordered array, size = "<<n<<", swap time = "<<swapTimes<<endl;
  67. arr1 = SortTestHelper::generateNearlyOrderedArray(n,swapTimes);
  68. arr2 = SortTestHelper::copyIntArray(arr1, n);
  69. arr3 = SortTestHelper::copyIntArray(arr1, n);
  70. SortTestHelper::testSort("Merge Sort", mergeSort, arr1, n);
  71. SortTestHelper::testSort("Quick Sort", quickSort, arr2, n);
  72. SortTestHelper::testSort("Quick Sort 3 Ways", quickSort3Ways, arr3, n);
  73. delete[] arr1;
  74. delete[] arr2;
  75. delete[] arr3;
  76. cout<<endl;
  77. // 测试3 测试存在包含大量相同元素的数组
  78. cout<<"Test for random array, size = "<<n<<", random range [0,10]"<<endl;
  79. arr1 = SortTestHelper::generateRandomArray(n,0,10);
  80. arr2 = SortTestHelper::copyIntArray(arr1, n);
  81. arr3 = SortTestHelper::copyIntArray(arr1, n);
  82. SortTestHelper::testSort("Merge Sort", mergeSort, arr1, n);
  83. SortTestHelper::testSort("Quick Sort", quickSort, arr2, n);
  84. SortTestHelper::testSort("Quick Sort 3 Ways", quickSort3Ways, arr3, n);
  85. delete[] arr1;
  86. delete[] arr2;
  87. delete[] arr3;
  88. return 0;
  89. }

②InsertionSort.h

  1. //
  2. // Created by liuyubobobo on 7/23/16.
  3. //
  4. #ifndef INC_08_QUICK_SORT_THREE_WAYS_INSERTIONSORT_H
  5. #define INC_08_QUICK_SORT_THREE_WAYS_INSERTIONSORT_H
  6. #include <iostream>
  7. #include <algorithm>
  8. using namespace std;
  9. template<typename T>
  10. void insertionSort(T arr[], int n){
  11. for( int i = 1 ; i < n ; i ++ ) {
  12. T e = arr[i];
  13. int j;
  14. for (j = i; j > 0 && arr[j-1] > e; j--)
  15. arr[j] = arr[j-1];
  16. arr[j] = e;
  17. }
  18. return;
  19. }
  20. // 对arr[l...r]范围的数组进行插入排序
  21. template<typename T>
  22. void insertionSort(T arr[], int l, int r){
  23. for( int i = l+1 ; i <= r ; i ++ ) {
  24. T e = arr[i];
  25. int j;
  26. for (j = i; j > l && arr[j-1] > e; j--)
  27. arr[j] = arr[j-1];
  28. arr[j] = e;
  29. }
  30. return;
  31. }
  32. #endif //INC_08_QUICK_SORT_THREE_WAYS_INSERTIONSORT_H

 

③MergeSort.h

  1. //
  2. // Created by liuyubobobo on 7/23/16.
  3. //
  4. #ifndef INC_08_QUICK_SORT_THREE_WAYS_MERGESORT_H
  5. #define INC_08_QUICK_SORT_THREE_WAYS_MERGESORT_H
  6. #include <iostream>
  7. #include <algorithm>
  8. #include "InsertionSort.h"
  9. using namespace std;
  10. // 将arr[l...mid]和arr[mid+1...r]两部分进行归并
  11. template<typename T>
  12. void __merge(T arr[], int l, int mid, int r){
  13. //* VS不支持动态长度数组, 即不能使用 T aux[r-l+1]的方式申请aux的空间
  14. //* 使用VS的同学, 请使用new的方式申请aux空间
  15. //* 使用new申请空间, 不要忘了在__merge函数的最后, delete掉申请的空间:)
  16. T aux[r-l+1];
  17. //T *aux = new T[r-l+1];
  18. for( int i = l ; i <= r; i ++ )
  19. aux[i-l] = arr[i];
  20. // 初始化,i指向左半部分的起始索引位置l;j指向右半部分起始索引位置mid+1
  21. int i = l, j = mid+1;
  22. for( int k = l ; k <= r; k ++ ){
  23. if( i > mid ){ // 如果左半部分元素已经全部处理完毕
  24. arr[k] = aux[j-l]; j ++;
  25. }
  26. else if( j > r ){ // 如果右半部分元素已经全部处理完毕
  27. arr[k] = aux[i-l]; i ++;
  28. }
  29. else if( aux[i-l] < aux[j-l] ) { // 左半部分所指元素 < 右半部分所指元素
  30. arr[k] = aux[i-l]; i ++;
  31. }
  32. else{ // 左半部分所指元素 >= 右半部分所指元素
  33. arr[k] = aux[j-l]; j ++;
  34. }
  35. }
  36. //delete[] aux;
  37. }
  38. // 使用优化的归并排序算法, 对arr[l...r]的范围进行排序
  39. template<typename T>
  40. void __mergeSort(T arr[], int l, int r){
  41. // 对于小规模数组, 使用插入排序
  42. if( r - l <= 15 ){
  43. insertionSort(arr, l, r);
  44. return;
  45. }
  46. int mid = (l+r)/2;
  47. __mergeSort(arr, l, mid);
  48. __mergeSort(arr, mid+1, r);
  49. // 对于arr[mid] <= arr[mid+1]的情况,不进行merge
  50. // 对于近乎有序的数组非常有效,但是对于一般情况,有一定的性能损失
  51. if( arr[mid] > arr[mid+1] )
  52. __merge(arr, l, mid, r);
  53. }
  54. template<typename T>
  55. void mergeSort(T arr[], int n){
  56. __mergeSort( arr , 0 , n-1 );
  57. }
  58. #endif //INC_08_QUICK_SORT_THREE_WAYS_MERGESORT_H

④QuickSort.h

  1. //
  2. // Created by liuyubobobo on 7/23/16.
  3. //
  4. #ifndef INC_07_QUICK_SORT_THREE_WAYS_QUICKSORT_H
  5. #define INC_07_QUICK_SORT_THREE_WAYS_QUICKSORT_H
  6. #include <iostream>
  7. #include <ctime>
  8. #include <algorithm>
  9. #include "InsertionSort.h"
  10. using namespace std;
  11. // 对arr[l...r]部分进行partition操作
  12. // 返回p, 使得arr[l...p-1] < arr[p] ; arr[p+1...r] > arr[p]
  13. template <typename T>
  14. int _partition(T arr[], int l, int r){
  15. // 随机在arr[l...r]的范围中, 选择一个数值作为标定点pivot
  16. swap( arr[l] , arr[rand()%(r-l+1)+l] );
  17. T v = arr[l];
  18. int j = l;
  19. for( int i = l + 1 ; i <= r ; i ++ )
  20. if( arr[i] < v ){
  21. j ++;
  22. swap( arr[j] , arr[i] );
  23. }
  24. swap( arr[l] , arr[j]);
  25. return j;
  26. }
  27. // 双路快速排序的partition
  28. // 返回p, 使得arr[l...p-1] < arr[p] ; arr[p+1...r] > arr[p]
  29. template <typename T>
  30. int _partition2(T arr[], int l, int r){
  31. // 随机在arr[l...r]的范围中, 选择一个数值作为标定点pivot
  32. swap( arr[l] , arr[rand()%(r-l+1)+l] );
  33. T v = arr[l];
  34. // arr[l+1...i) <= v; arr(j...r] >= v
  35. int i = l+1, j = r;
  36. while( true ){
  37. // 注意这里的边界, arr[i] < v, 不能是arr[i] <= v
  38. // 思考一下为什么?
  39. while( i <= r && arr[i] < v )
  40. i ++;
  41. // 注意这里的边界, arr[j] > v, 不能是arr[j] >= v
  42. // 思考一下为什么?
  43. while( j >= l+1 && arr[j] > v )
  44. j --;
  45. // 对于上面的两个边界的设定, 有的同学在课程的问答区有很好的回答:)
  46. // 大家可以参考: http://coding.imooc.com/learn/questiondetail/4920.html
  47. if( i > j )
  48. break;
  49. swap( arr[i] , arr[j] );
  50. i ++;
  51. j --;
  52. }
  53. swap( arr[l] , arr[j]);
  54. return j;
  55. }
  56. // 对arr[l...r]部分进行快速排序
  57. template <typename T>
  58. void _quickSort(T arr[], int l, int r){
  59. // 对于小规模数组, 使用插入排序进行优化
  60. if( r - l <= 15 ){
  61. insertionSort(arr,l,r);
  62. return;
  63. }
  64. // 调用双路快速排序的partition
  65. int p = _partition2(arr, l, r);
  66. _quickSort(arr, l, p-1 );
  67. _quickSort(arr, p+1, r);
  68. }
  69. template <typename T>
  70. void quickSort(T arr[], int n){
  71. srand(time(NULL));
  72. _quickSort(arr, 0, n-1);
  73. }
  74. #endif //INC_07_QUICK_SORT_THREE_WAYS_QUICKSORT_H

⑤SortTestHelper.h

  1. //
  2. // Created by liuyubobobo on 7/21/16.
  3. //
  4. #ifndef INC_08_QUICK_SORT_THREE_WAYS_SORTTESTHELPER_H
  5. #define INC_08_QUICK_SORT_THREE_WAYS_SORTTESTHELPER_H
  6. #include <iostream>
  7. #include <algorithm>
  8. #include <string>
  9. #include <ctime>
  10. #include <cassert>
  11. using namespace std;
  12. namespace SortTestHelper {
  13. // 生成有n个元素的随机数组,每个元素的随机范围为[rangeL, rangeR]
  14. int *generateRandomArray(int n, int range_l, int range_r) {
  15. int *arr = new int[n];
  16. srand(time(NULL));
  17. for (int i = 0; i < n; i++)
  18. arr[i] = rand() % (range_r - range_l + 1) + range_l;
  19. return arr;
  20. }
  21. // 生成一个近乎有序的数组
  22. // 首先生成一个含有[0...n-1]的完全有序数组, 之后随机交换swapTimes对数据
  23. // swapTimes定义了数组的无序程度
  24. int *generateNearlyOrderedArray(int n, int swapTimes){
  25. int *arr = new int[n];
  26. for(int i = 0 ; i < n ; i ++ )
  27. arr[i] = i;
  28. srand(time(NULL));
  29. for( int i = 0 ; i < swapTimes ; i ++ ){
  30. int posx = rand()%n;
  31. int posy = rand()%n;
  32. swap( arr[posx] , arr[posy] );
  33. }
  34. return arr;
  35. }
  36. // 拷贝整型数组a中的所有元素到一个新的数组, 并返回新的数组
  37. int *copyIntArray(int a[], int n){
  38. int *arr = new int[n];
  39. //* 在VS中, copy函数被认为是不安全的, 请大家手动写一遍for循环:)
  40. copy(a, a+n, arr);
  41. return arr;
  42. }
  43. // 打印arr数组的所有内容
  44. template<typename T>
  45. void printArray(T arr[], int n) {
  46. for (int i = 0; i < n; i++)
  47. cout << arr[i] << " ";
  48. cout << endl;
  49. return;
  50. }
  51. // 判断arr数组是否有序
  52. template<typename T>
  53. bool isSorted(T arr[], int n) {
  54. for (int i = 0; i < n - 1; i++)
  55. if (arr[i] > arr[i + 1])
  56. return false;
  57. return true;
  58. }
  59. // 测试sort排序算法排序arr数组所得到结果的正确性和算法运行时间
  60. template<typename T>
  61. void testSort(const string &sortName, void (*sort)(T[], int), T arr[], int n) {
  62. clock_t startTime = clock();
  63. sort(arr, n);
  64. clock_t endTime = clock();
  65. cout << sortName << " : " << double(endTime - startTime) / CLOCKS_PER_SEC << " s"<<endl;
  66. assert(isSorted(arr, n));
  67. return;
  68. }
  69. };
  70. #endif //INC_08_QUICK_SORT_THREE_WAYS_SORTTESTHELPER_H


 

<本文完>

 

参考资料:

http://coding.imooc.com/class/chapter/71.html#Anchor

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/384211
推荐阅读
相关标签
  

闽ICP备14008679号