2149: wjw的排序问题
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 58 Solved: 18
[ Submit][ Status][ Web Board]
Description
菜鸡wjw觉得最近对排序算法的理解又上了一个档次,于是准备研究一下自己会的所有排序算法,经过测试,他写的所有代码里最快的只有一句话"std::sort(a,a+len)",于是他终于发现自己依旧是个菜鸡...
那么问题来了,如果不用"std::sort()",你能写出什么样的排序代码呢?
Input
一组数据,第一行一个n表示序列长度(1<=n<=3000000)
第二行包含n个数字,用空格隔开
Output
升序排序后的结果,用空格隔开,末尾没有空格
Sample Input
51 3 2 4 5
Sample Output
1 2 3 4 5
解析:先说std的sort()函数,最快时间复杂度为nlogn,最慢为n2;
有这么一张表:
最好的算法也就是归并了,比较稳定,快速排序在最坏的情况就是每个数都相同,这时间n2,但是可以稍加修改,可以变到稳定的nlogn,这点自行百度。
#include<bits/stdc++.h> using namespace std; int n; void merge(int arr[],int l,int mid,int r) { int *T=new int[r-l+1]; for(int i=l; i<=r; i++) { T[i-l]=arr[i]; } int i=l,j=mid+1; for(int k=l; k<=r; k++){ if(i>mid) { arr[k]=T[j-l]; j++; }else if(j>r) { arr[k]=T[i-l]; i++; }else if(T[i-l]<T[j-l]) { arr[k]=T[i-l]; i++; }else if(T[i-l]>=T[j-l]) { arr[k]=T[j-l]; j++; } } delete []T; } void merge_sort(int arr[],int l,int r) { if(l>=r)return; int mid =(l+r)/2; merge_sort(arr,l,mid); merge_sort(arr,mid+1,r); if(arr[mid]>arr[mid+1]) { merge(arr,l,mid,r); } } int main() { while(~scanf("%d",&n)) { int *a=new int[n]; for(int i=0; i<n; i++)scanf("%d",&a[i]); merge_sort(a,0,n-1); for(int i=0; i<n-1; i++) printf("%d ",a[i]); printf("%d\n",a[n-1]); delete []a; } return 0; }