归并排序和快速排序

归并排序:将数组每次分成两部分分别排序,然后逐一合并

 



1
template<typename T> 2 void __merge(T arr[], int l, int mid, int r) { 3 int *aux = new int[r - l + 1];//开辟新的空间 4 for (int i = l; i <= r; i++) 5 aux[i - l] = arr[i]; 6 int i = l, j = mid + 1; 7 for (int k = l; k <= r; k++) { 8 if (i > mid) 9 { 10 arr[k] = aux[j - l]; 11 j++; 12 } 13 else if (j > r) { 14 arr[k] = aux[i - l]; 15 i++; 16 } 17 else if (aux[i - l] < aux[j - l]) 18 { 19 arr[k] = aux[i - l]; 20 i++; 21 } 22 else 23 { 24 arr[k] = aux[j - l]; 25 j++; 26 } 27 } 28 delete[] aux; 29 30 } 31 template<typename T> 32 void __mergeSort(T arr[], int l, int r) { 33 if (r - l <= 15) { 34 insertionSort(arr, l, r);//使用插入排序对其进行优化 35 return; 36 } 37 /*if(r-l<=15) { 38 insertionSort(arr,l,r); 39 return ; 40 } 41 */ 42 int mid = (l + r) / 2; 43 __mergeSort(arr, l, mid); 44 __mergeSort(arr, mid + 1, r); 45 if (arr[mid]>arr[mid + 1])//对近乎有序的数组的优化 46 __merge(arr, l, mid, r); 47 } 48 template<typename T> 49 void mergeSort(T arr[], int n) { 50 __mergeSort(arr, 0, n - 1); 51 } 52 template<typename T> 53 void mergeSortBU(T arr[], int n) {//自底向上排序 54 for (int sz = 1; sz <= n; sz += sz) 55 for (int i = 0; i + sz < n; i += sz + sz) 56 __merge(arr, i, i + sz - 1, min(n - 1, i + sz + sz - 1)); 57 }

快速排序:将数组分成两部分,使得组边部分小于标准,右边部分大于标准,这样就将标准元素放到了排序数组正确的位置

 1 template<typename T>//找到一个索引使得arr[l...p-1]<v,arr[p+1..r]>v,这样v就在恰当的位置了
 2 int  __partition(T arr[], int l, int r) {
 3     swap(arr[l], arr[rand() % (r - l + 1) + l]);//优化
 4 
 5     T v = arr[l];//一个标准两个索引
 6     int j = l;//使得arr[l+1...j] < v ; arr[j+1...i) > v,每次遇到小于v的元素进行交换, 扩充arr[l+1...j]的同时,将大于部分往后放
 7     for (int i = l + 1; i <= r; i++)
 8     {
 9         if (arr[i] < v) {
10             j++;
11             swap(arr[i], arr[j]);
12         }
13     }
14     swap(arr[l], arr[j]);//将v放到恰当位置
15     return j;
16 }
17 template<typename T>
18 void __quickSort(T arr[], int l, int r) {
19     if (r - l <= 15) {
20         insertionSort(arr, l, r);
21         return;
22     }
23     int p = __partition(arr, l, r);
24     __quickSort(arr, l, p - 1);
25     __quickSort(arr, p + 1, r);
26 }

27 template<typename T>//找到一个索引使得arr[l...p-1]<v,arr[p+1..r]>v,这样v就在恰当的位置了 28 int __partition2(T arr[], int l, int r) { 29 swap(arr[l], arr[rand() % (r - l + 1) + l]);//优化,对于近乎有序的数组,快速排序会退化成一个O(n2)级别的算法 30 31 T v = arr[l];//一个标准两个索引 32 int i = l + 1, j = r; 33 while (true) { 34 while (i <= r && arr[i] < v) 35 i++; 36 37 while (j >= l + 1 && arr[j] > v) 38 j--; 39 if (i>j) break; 40 swap(arr[i], arr[j]); 41 i++; 42 j--; 43 } 44 swap(arr[j], arr[l]); 45 return j; 46 } 47 template<typename T> 48 void __quickSort2(T arr[], int l, int r) { 49 if (r - l <= 15) { 50 insertionSort(arr, l, r); 51 return; 52 } 53 int p = __partition2(arr, l, r); 54 __quickSort2(arr, l, p - 1); 55 __quickSort2(arr, p + 1, r); 56 } 57 template<typename T> 58 void quickSort(T arr[], int n) { 59 srand(time(NULL)); 60 __quickSort2(arr, 0, n - 1); 61 }

三路快排

 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 
10     swap(arr[l], arr[rand() % (r - l + 1) + l]);
11 
12     T v = arr[l];
13 
14     int lt = l;     // arr[l+1...lt] < v
15     int gt = r + 1; // arr[gt...r] > v
16     int i = l + 1;    // arr[lt+1...i) == v
17     while (i < gt) {
18         if (arr[i] < v) {
19             swap(arr[i], arr[lt + 1]);
20             i++;
21             lt++;
22         }
23         else if (arr[i] > v) {
24             swap(arr[i], arr[gt - 1]);
25             gt--;
26         }
27         else { // arr[i] == v
28             i++;
29         }
30     }
31 
32     swap(arr[l], arr[lt]);
33 
34     __quickSort3Ways(arr, l, lt - 1);
35     __quickSort3Ways(arr, gt, r);
36 }
37 
38 template <typename T>
39 void quickSort3Ways(T arr[], int n) {
40 
41     srand(time(NULL));
42     __quickSort3Ways(arr, 0, n - 1);
43 }
原文地址:https://www.cnblogs.com/bingzzzZZZ/p/8453141.html