
归并排序模板
发布日期:2021-05-07 06:19:49
浏览次数:18
分类:原创文章
本文共 1072 字,大约阅读时间需要 3 分钟。
思路:
每次把数组分成两部分,一直递归下去,当分成最少长度后,开始从最底层向上归并相邻的两段数组。时间复杂度O(n log n)。
代码:
#include <iostream>#include <algorithm> #include <cstdio> using namespace std;void merge(int a[], int left, int right, int mid){ int tmp[right-left+1], i, j, k; for (k=left; k<=right; k++) tmp[k-left]=a[k]; i=left; j=mid+1; for (k=left; k<=right; k++){ //如果一个较先完成后,剩下的那一部分就直接拷贝过去,需要提前判断 if (i>mid){ //mid属于左侧那一半 a[k]=tmp[j-left]; j++; }else if (j>right){ a[k]=tmp[i-left]; i++; }else if (tmp[i-left]>tmp[j-left]){ a[k]=tmp[j-left]; j++; }else{ a[k]=tmp[i-left]; i++; } }}void merge_sort(int a[], int left, int right){ if (left>=right) return; int mid=(left+right)/2; merge_sort(a, left, mid);//递归 每次将区间分成两块 merge_sort(a, mid+1, right); merge(a, left, right, mid);//从最低层向上归并 return;}void mergesort(int a[], int left, int right){ merge_sort(a, left, right-1);//左闭右开数组区间 }int main(){ int a[105], n; scanf("%d", &n); for (int i=0; i<n; i++) scanf("%d", &a[i]); mergesort(a, 0, n);//下标从零开始 左闭右开 for (int i=0; i<n; i++) printf("%d ", a[i]); return 0;}
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年04月11日 02时25分54秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
ubuntu中安装scikit-learn
2019-03-04
添加安装glad到Ubuntu环境
2019-03-04
Ubuntu2004 向日葵安装笔记
2019-03-04
Ubuntu 安装后无法正常打开——进入grub安全命令行模式
2019-03-04
C/C++ new和delete使用注意事项
2019-03-04
Jmeter (一) ----环境搭建
2019-03-04
性能调优优化思路
2019-03-04
CodeBase(四)项目总结
2019-03-04
【ACM】HDU 5640 King‘s Cake
2019-03-04
理解充分条件与必要条件
2019-03-04
java集合框架
2019-03-04
面向对象的三大特征
2019-03-04
SpringCloud和SprinBoot之间的关系
2019-03-04
奇怪的小东西
2019-03-04
剑指offer打卡Day14:数组中只出现一次的数字
2019-03-04
使用VSCode配合keil来编写Cortex-M程序
2019-03-04
电磁兼容的PCB设计(二)
2019-03-04
电磁兼容的PCB设计(六)
2019-03-04
i.mx rt系列遇害笔记-----systick被gpio害了
2019-03-04
零输入响应与零状态响应响应
2019-03-04