【演算法導論】歸併排序
阿新 • • 發佈:2018-11-25
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <cstring> #include <string> const int maxn=500000,INF=0x3f3f3f3f; int L[maxn/2+2],R[maxn/2+2],a[maxn]; void merge(int a[],int left,int mid,int right) { int n1=mid-left,n2=right-mid; for(int i=0;i<n1;i++) L[i]=a[left+i]; for(int i=0;i<n2;i++) R[i]=a[mid+i]; L[n1]=R[n2]=INF; int i=0,j=0; for(int k=left;k<right;k++) { if(L[i]<=R[j]) { count++; a[k]=L[i++]; } else { count++; a[k]=R[j++]; } } } void mergesort(int a[],int left,int right) { if(left+1<right) { int mid=(left+right)/2; mergesort(a,left,mid); mergesort(a,mid,right); merge(a,left,mid,right); } } int main () { int len,i; while(scanf("%d",&len)!=EOF) { for(i=0;i<len;i++) scanf("%d",&a[i]); mergesort(a,0,len); for(int i=0;i<len;i++) { if(i!=len-1) printf("%d ",a[i]); else printf("%d\n",a[i]); } } return 0; }