归并排序(分治)

经典的排序算法,经典的分治策略。

重点在于Merge函数对两部分已排序数组的合并。注意使用哨兵牌技巧。

 1 /*
 2  * 归并排序
 3  */
 4 int helper_1[10005];
 5 int helper_2[10005];
 6 void merge(int arr[], int p, int q, int r)
 7 {
 8     int i = 0, j = 0;
 9     for (i = p; i <= q; i++)
10         helper_1[i] = arr[i];
11     for (j = q + 1; j <= r; j++)
12         helper_2[j] = arr[j];
13     helper_1[q + 1] = INF;  // 设置哨兵牌
14     helper_2[r + 1] = INF;  // 设置哨兵牌
15     i = p; j = q + 1;  // 指针设置为初始状态
16     for (int k = p; k <= r; k++)
17     {
18         if (helper_1[i] >= helper_2[j]) {
19             arr[k] = helper_2[j];
20             j++;
21         }
22         else {
23             arr[k] = helper_1[i];
24             i++;
25         }
26     }
27 }
28 // 归并排序
29 void mergeSort(int arr[], int p, int r)
30 {
31     if (p < r) {
32         int    mid = (p + r) >> 1;
33         mergeSort(arr, p, mid);
34         mergeSort(arr, mid + 1, r);
35         merge(arr, p, mid, r);
36     }
37 }
38 int main()
39 {
40     int ar[20];
41     srand((unsigned)time(nullptr));
42     for (int i = 0; i <= 19; i++)
43         ar[i] = rand() % (10 - 1 + 1) + 1;
44     mergeSort(ar, 0, 19);
45     // 打印
46     for (int i = 0; i <= 19; i++)
47         cout << ar[i] << " ";
48     return 0;
49 }

 

posted on 2020-04-18 20:48  Black_x  阅读(164)  评论(0编辑  收藏  举报