zcmu-2149(归并排序)

2149: wjw的排序问题

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 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;  
}

猜你喜欢

转载自blog.csdn.net/yu121380/article/details/80565916