归并排序

 

 

 

 

 

http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1065

 

 

#include<cstdio> #define MAX 100002 int a[MAX],n; void meger_sort(int l,int m,int r){ int i=l,j=m+1,tmp[MAX];int index=0; while(i<=m && j<=r){ if(a[i]<a[j]) tmp[index++]=a[i++]; else tmp[index++]=a[j++]; } while(i<=m) tmp[index++]=a[i++]; while(j<=r) tmp[index++]=a[j++]; for(i=l,index=0;i<=r;++i){ a[i]=tmp[index++]; } } void div(int l,int r){ if(l<r){ int m=(l+r)/2; div(l,m); div(m+1,r); meger_sort(l,m,r); } } void init(){ scanf("%d",&n); for(int i=0;i<n;++i)scanf("%d",&a[i]); } void print(){ for(int i=0;i<n;++i) if(i==n-1)printf("%d",a[i]); else printf("%d ",a[i]); } int main(int argc, char *argv[]) { init(); div(0,n-1); print(); return 0; }

 

#include<iostream> using namespace std; #define MAX 100001 int A[MAX],T[MAX]; int n; void input(){ cin>>n; for(int i=0;i<n;++i)cin>>A[i]; } void print(){ for(int i=0;i<n;++i) if(i==n-1)cout<<A[i]<<endl; else cout<<A[i]<<" "; } void merge_sort(int *A,int x,int y,int *T){//x可到达,y不可到达 if(y>x+1){ int m=x+(y-x)/2; int p=x,q=m,i=x; merge_sort(A,x,m,T);//递归求解 merge_sort(A,m,y,T); while(p<m || q<y){ // 如果q>=y说明右半边已经越界,只剩下左半边 if(q>=y || (p<m && A[p]<=A[q]))T[i++]=A[p++]; else T[i++]=A[q++]; } for(i=x;i<y;++i)A[i]=T[i]; } } int main(int argc, char *argv[]) { input(); merge_sort(A,0,n,T); print(); return 0; }

你可能感兴趣的:(归并排序)