整体思想
归并排序整体思想就是将一个长度为n的数组对半分,分成每个区间只有一个元素时进行每两个区间排序,然后合并。最后整个数组就是排序后的样子。
步骤简述
- 找到对分点: mid=l+r>>1;
- 递归函数过程
- 合并
其中核心部分就是合并过程:
现假设有两数组:需要按从小到大的过程进行合并,a[na],b[nb];
设一答案数组res[na+nb],指向a的指针ia,指向表的指针ib,指向答案的指针ir;
如果a[ia]<=b[ib],res[ir++]=a[ia++]
否则res[ir++]=b[ib++];
最后一直到a或者b的指针直到其末尾,然后到末尾后,再将没到末尾的剩下元素全部插入res末尾;
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define in(x) scanf("%d",&x)
#define debug(x) cerr<<#x<<" : "<<endl
using namespace std;
int a[100005],tmp[100005];
void merge_sort(int l,int r);
int main(){
int n;in(n);
for(int i=1;i<=n;i++){
in(a[i]);
}
merge_sort(1,n);
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
void merge_sort(int l,int r){
if(l>=r){
return;
}
int mid=l+r>>1;
merge_sort(l,mid);
merge_sort(mid+1,r);
int k=1;
int i=l,j=mid+1;
while(i<=mid&&j<=r){
if(a[i]<=a[j]){
tmp[k]=a[i++];
}
else {
tmp[k]=a[j++];
}
k++;
}
while(i<=mid){
tmp[k++]=a[i++];
}
while(j<=r){
tmp[k++]=a[j++];
}
for(int i=l,j=1;i<=r;i++,j++){
a[i]=tmp[j];
}
}