// 归并排序是稳定的,原序列中有两个相同的算,但是排序后相对位置并没有发生变化
// 1-------left----1----right------1
// 第一步,分界点是中间的位置
// 第二步,进性递归排序 left,right --- 分治的思想方法
// 第三步,归并,合二为一 (最重要的部分就是合并区间) O(n)
// 归并的方法,就是两个区间指向的指针进行往后移的比较
//也就是从第一层的n个元素,一直划分为原来的1/2 ,那么可以划分为 log2n层,并且每层的复杂度为O(N)
//归并排序的时候最大的一个特点就是区间中的所有的数都可以进行两两的比较操作;
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1000010;
int p[N],temp[N];
int n;
void mergeSort(int p[],int l,int r){
if(l>=r) return ;
int mid = (l+r)>>1;
mergeSort(p,l,mid);
mergeSort(p,mid+1,r);
//下面进行两个区间合并操作
int cnt=0,i=l,j=mid+1;
while(i<=mid && j<=r){
if(p[i]<p[j]) temp[cnt++] = p[i++];
else temp[cnt++] = p[j++];
}
while(i<= mid) temp[cnt++] = p[i++];
while(j<= r) temp[cnt++] = p[j++];
//这里的下标搞错了应该从l开始,并不应该从0开始进行数组的循环;
//这里也就是覆盖原来的整体的区间
for(int i=0,j=l;i<cnt;i++,j++){
p[j] = temp[i];
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++)
scanf("%d",&p[i]);
mergeSort(p,0,n-1);
for(int i=0;i<n;i++)
cout<<p[i]<<" ";
return 0;
}
787.归并排序
于 2024-02-28 09:40:35 首次发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)