# 讲个识儿 4集·归并排序
2026-06-15 22:55:01
发布于:陕西
Xp1.什么是归并排序
记笔记!
归并排序在O(NlogN)级别
是一种主要由归并思想而产生的排序
其原理为把整个数组一半一半地拆分为多个数,最后和到一块。
Xp2.排序思路
先分开(我们通常遵循左多右少机制)
a[i]=2 5 10 4 9 1 3 8 11 999

↑拆开后就该合了↓

第一层↑,不需要改变

第二层↑,不需要改变

第三层
注意看左上角,<2,5,10> 和 <4,9> 合并时,位置发生变化,非原图
而<1,3,8> 和 <11 999> 合并时,位置并不需要发生变化

最后一层,排序完成
Xp3.合并
有人问,如何两个合并?
其实是双指针
LOOK!!!
<2,5,10> <4,9>

i右移

j右移

i右移

结束
总结就是看哪个更小移进a[++i],并将该属的数组指针后移即可,这样便能完成排序,可以参照A5552-二路归并进行操作
Xp4.模块分解
分
分最简单,通过Mid递归即可
if(l==r) return;
int mid=(l+r)/2; // l+r>>1
Mid_sort(l,mid);
Mid_sort(mid+1,r);
并
并就较难了,首先我们需要合项的参数
int x=l,y=mid+1,z=l
接着双指针合项,比较大小
while(x<=mid&&y<=r){
if(a[x]<a[y]) b[z++]=a[x++];
else b[z++]=a[y++];
}
while(x==mid) b[z++]=a[x++];
while(y==r) b[z++]==a[y++]; // 双指针移动复位
for(int i=1;i<=r;i++){
a[i]=b[i]; //执行赋值操作,a[i]合并完成
}
Xp5.代码
int n,a[1005],b[1005];
void Mid_sort(int l,int r){
if(l==r) return;
int mid=l+r>>1;
Mid_sort(l,mid);
Mid_sort(mid+1,r);
int x=l,y=mid+1,z=l;
while(x<=mid&&y<=r){
if(a[x]<a[y]) b[z++]=a[x++];
else b[z++]=a[y++];
}
while(x==mid) b[z++]=a[x++];
while(y==r) b[z++]==a[y++];
for(int i=1;i<=r;i++){
a[i]=b[i];
}
}
这里空空如也

















有帮助,赞一个