归并排序可以理解为快排的反向,采用分治的思想,先排两边在用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;
}

京公网安备 11010502036488号