归并排序和快速排序

Posted bingzzzzzz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了归并排序和快速排序相关的知识,希望对你有一定的参考价值。

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

 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 }

 

以上是关于归并排序和快速排序的主要内容,如果未能解决你的问题,请参考以下文章

快速排序和归并排序的区别,有代码

高级排序java实现(希尔归并快速)

python实现快速排序归并排序

python实现快速排序归并排序

python实现快速排序归并排序

python实现快速排序归并排序