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;
}