归并排序与快速排序不同的是,先将数组进行划分,到最后为1个时,就返回上层,回溯进行排序,在回溯时,通过两个指针进行操作,由于两个子数组已排好序,故子数组中左边是小于右边的,故每次将两个子数组中最小的放入另一个数组,再将值重新返回给该数组即可。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int dp[N];
int n;
void merge_sort(int l,int r){
if(l>=r) return;
int mid=l+(r-l)/2;
merge_sort(l,mid),merge_sort(mid+1,r);
int a[N];
int i=l,k=0,j=mid+1;
while(i<=mid&&j<=r){
if(dp[i]<=dp[j]){
a[k++]=dp[i++];
}else a[k++]=dp[j++];
}
while(i<=mid) a[k++]=dp[i++];
while(j<=r) a[k++]=dp[j++];
for(i=l,k=0;i<=r;i++) dp[i]=a[k++];
}
int main(){
cin>>n;
for(int i=0;i<n;i++) scanf("%d",&dp[i]);
merge_sort(0,n-1);
for(int i=0;i<n;i++) printf("%d ",dp[i]);
return 0;
}
有一个细节就是,在遍历完后要看看两个数组哪个还未遍历完,将其直接添加即可!