归并排序(分治)

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

重点在于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   Black_x  阅读(165)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示