O(n*logn)级别的算法之二(快速排序)的三种实现方法详解及其与归并排序的对比

一,单路快排
1.测试用例:

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyxsyf.html