洛谷1177 歸併排序
阿新 • • 發佈:2018-12-21
因為這個題去學了這歸併排序和快排,真的神奇,尤其是歸併排序的程式碼,有一種美感呢。
//歸併排序 #include <bits/stdc++.h> using namespace std; const int maxn=100000+10; int a[maxn];//從小到大 #define swap(x,y) x=x^y,y=x^y,x=x^y; int* merg(int arr1[],int l,int mod,int r) { int i=l,j=mod+1,k=0; int* arr2=(int*)malloc(sizeof(int)*(r-l+1)); while(i<=mod&&j<=r){ if(arr1[i]<=arr1[j]) arr2[k++]=arr1[i++]; else arr2[k++]=arr1[j++]; } while(i<=mod){ arr2[k++]=arr1[i++]; } while(j<=r){ arr2[k++]=arr1[j++]; } for(i=0,j=l;i<r-l+1;i++){ arr1[j++]=arr2[i]; } free(arr2); } void mergesort(int a[],int l,int r) { if(l<r){ int mod=(l+r)>>1; mergesort(a,l,mod); mergesort(a,mod+1,r); merg(a,l,mod,r); } } int main() { int n,i,j,k; cin >> n; int sum=0; for(i=0;i<n;i++) scanf("%d",&a[i]); mergesort(a,0,n-1); for(i=0;i<n;i++){ printf("%d",a[i]); if(i!=n-1) printf(" "); else printf("\n"); } return 0; }