归并排序可以理解为快排的反向,采用分治的思想,先排两边在用O(n)的时间合并在一起
代码(感觉比快排实现容易些)
#include<bits/stdc++.h>
using namespace std;
void merge(int a[],int l,int r){
    int b[r-l+1],mid=(l+r)>>1,l1=0,r1=mid+1-l;
    for(int i=l;i<=r;i++) b[i-l]=a[i];
    for(int i=l;i<=r;i++){
        if(r1+l>r) a[i]=b[l1++];
        else if(l1+l>mid) a[i]=b[r1++];
        else if(b[l1]>b[r1]) a[i]=b[r1++];
        else a[i]=b[l1++];
    }
}
void merge_sort(int a[],int l,int r){
    if(l>=r) return ;
    int mid=(l+r)>>1;
    merge_sort(a,mid+1,r);
    merge_sort(a,l,mid);
    merge(a,l,r);
}
int main(){
    int n;
    int a[19993];
    srand(time(0));
    n=rand()%1000+1;
    for(int i=0;i<n;i++)a[i]=rand()%100+1;
    merge_sort(a,0,n-1);
    for(int i=0;i<n;i++)cout<<a[i]<<endl;
}