归并排序算法

举报
irrational 发表于 2022/01/19 00:40:59 2022/01/19
【摘要】 给定你一个长度为n的整数数列。 请你使用归并排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。 输入格式 输入共两行,第一行包含整数n。 第二行包含n个整数(所有整数均在1~10°范围内),表示整个数列。 输出格式 输出共一行,包含n个整数,表示排好序的数列。 数据范围 1 <n ≤ 100000 #include...

给定你一个长度为n的整数数列。
请你使用归并排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。
输入格式
输入共两行,第一行包含整数n。
第二行包含n个整数(所有整数均在1~10°范围内),表示整个数列。
输出格式
输出共一行,包含n个整数,表示排好序的数列。
数据范围
1 <n ≤ 100000


  
  1. #include <iostream>
  2. using namespace std;
  3. const int N = 1e5 + 10;
  4. int a[N], tmp[N];
  5. void merge_sort(int q[], int l, int r)
  6. {
  7. if (l >= r) return;
  8. int mid = l + r >> 1;
  9. merge_sort(q, l, mid), merge_sort(q, mid + 1, r);
  10. int k = 0, i = l, j = mid + 1;
  11. while (i <= mid && j <= r)
  12. if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ];
  13. else tmp[k ++ ] = q[j ++ ];
  14. while (i <= mid) tmp[k ++ ] = q[i ++ ];
  15. while (j <= r) tmp[k ++ ] = q[j ++ ];
  16. for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j];
  17. }
  18. int main()
  19. {
  20. int n;
  21. scanf("%d", &n);
  22. for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]);
  23. merge_sort(a, 0, n - 1);
  24. for (int i = 0; i < n; i ++ ) printf("%d ", a[i]);
  25. return 0;
  26. }

我们可以看到,归并排序其实也很简单,我们只用将数组不断地划分,直到最后,划分到很小,将较小的数字放到前面去即可。

文章来源: blog.csdn.net,作者:irrationality,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_54227557/article/details/120593354

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。