博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[归并排序]
阅读量:5902 次
发布时间:2019-06-19

本文共 1043 字,大约阅读时间需要 3 分钟。

基本思想

分而治之

可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。阶段可以理解为就是递归拆分子序列的过程,递归深度为log2n。

合并相邻有序子序列

再来看看阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤。

代码实现

1 #include 
2 #include
3 #include
4 using namespace std; 5 int a[500005],b[500005];//b 为排完序的数组 6 long long ans; 7 void mergesort(int l,int r) 8 { 9 if(l==r)10 return;11 int mid=(l+r)>>1;12 mergesort(l,mid);13 mergesort(mid+1,r);14 int i=l,j=mid+1,k=l;15 while(i<=mid&&j<=r)16 {17 if(a[i]<=a[j])18 b[k++]=a[i++];19 else b[k++]=a[j++];20 }21 while(i<=mid) b[k++]=a[i++];22 while(j<=r) b[k++]=a[j++];23 for(int q=l;q<=r;q++) a[q]=b[q];24 }25 int main()26 {27 int n;28 scanf("%d",&n);29 for(int i=1;i<=n;i++)30 scanf("%d",&a[i]);31 mergesort(1,n);32 for(int i=1;i<=n;i++)33 printf("%d ",b[i]);34 return 0;35 }

 

转载于:https://www.cnblogs.com/-Wind-/p/10505558.html

你可能感兴趣的文章
比较运算符 between /in/ and
查看>>
围观窗体与组件02 - 零基础入门学习Delphi24
查看>>
diplay,Position,Float 之间的关系
查看>>
javascript oo实现(转)
查看>>
蓝桥杯-最大最小公倍数
查看>>
route命令详情
查看>>
Activity跳转时生命周期跟踪
查看>>
artemplate使用
查看>>
Android编程之Listener侦听的N种写法及实现原理
查看>>
架构,改善程序复用性的设计~第四讲 方法的重载真的用不到吗?
查看>>
清明就这么过去了
查看>>
网络神经科学
查看>>
Labview 查看一次while循环运行的时间
查看>>
canvas 截图图片 生成新图片
查看>>
面试经典之内部排序
查看>>
《道德经》程序员版第二章
查看>>
JPA学习(1)基础认知
查看>>
WinForm 水晶报表的简单使用
查看>>
初学Python(三)——字典
查看>>
在vc6.0下编的对话框界面如果没做过其他处理,往往显的很生硬,怎么样才能使他有Windows XP的风格呢,其实也很简单,我们来看看下面两种方法。...
查看>>