题目大意:略。
解题思路:快速排序对排序好的或相等的元素进行排序会形成单枝树,很慢,这时用归并排序。
AC 代码
#include<bits/stdc++.h> #include<cmath> #define mem(a,b) memset(a,b,sizeof a); using namespace std; typedef long long ll; const int maxn=3e6+1000; int a[maxn],tmp[maxn]; void mergeArr(int first,int mid,int last) { int i=first, j=mid+1; int m=mid, n=last, k=0; while(i<=m && j<=n) if(a[i]<=a[j]) tmp[k++]=a[i++]; else tmp[k++]=a[j++]; while(i<=m) tmp[k++]=a[i++]; while(j<=n) tmp[k++]=a[j++]; for(i=0;i<k;i++) a[first+i]=tmp[i]; } void mergeSort(int first, int last) { if(first<last) { int mid=first+((last-first)>>1); // >> 优先级低于 + - mergeSort(first,mid); mergeSort(mid+1,last); mergeArr(first,mid,last); } } int main() { int n; while(~scanf("%d",&n)) { for(int i=0;i<n;i++) scanf("%d",&a[i]); mergeSort(0,n-1); for(int i=0;i<n;i++) { if(i==0) printf("%d",a[i]); else printf(" %d",a[i]); } puts(""); } return 0; }