xmuoj-大数排序

描述

小鲁虽然编程能力很一般,但是嘴皮子上不服输。他很喜欢拿自己不懂的问题考小华。

刚学会冒泡排序的他,决定挑战一下小华的智商:

给定你一个长度为n的整数数列。

请你对这个数列按照从小到大进行排序。

并将排好序的数列按顺序输出。

小鲁刻意隐瞒了数据的规模,你觉得小华能够搞定吗?

偷偷告诉你:1≤n≤100000,所有整数均在1--10^9范围内

后记:小华使用快速排序秒过,小鲁惨败,因为他看不懂小华的代码......

输入

输入共两行,第一行包含整数 n。

第二行包含 n 个整数,表示整个数列。

输出

输出共一行,包含 n 个整数,表示排好序的数列。

输入样例 1 

12
111584322 907287398 13562672 615771042 83035480 323016588 501254568 158361642 388135644 58329696 400904710 38908140

输出样例 1

13562672 38908140 58329696 83035480 111584322 158361642 323016588 388135644 400904710 501254568 615771042 907287398 

这一题就是使用快速排序,具体算法思路就看别的文章了,但是因为这一题的数据量很大,在C++中scanf、printf的效率比cin、cout的效率快很多,所以在读取和输出时要使用scanf和printf,这样子才不会有的点运行超时。


参考代码

#include <iostream>

using namespace std;
int partition(int arr[], int left, int right)
{
    int base = arr[left];
    while (left < right)
    {
        while (left < right && arr[right] >= base)
        {
            right--;
        }
        arr[left] = arr[right];
        while (left < right && arr[left] <= base)
        {
            left++;
        }
        arr[right] = arr[left];
    }
    arr[left] = base;
    return left;
}

void sort(int arr[], int left, int right)
{
    if (left >= right)
        return;
    int pivot = partition(arr, left, right); 
    sort(arr, left, pivot - 1);
    sort(arr, pivot + 1, right);
}
int main()
{
    int n;
    cin >> n;
    int *arr = new int[n];
    for (int i = 0; i < n; i++)
        scanf("%d",&arr[i]);
    sort(arr, 0, n-1);
    for (int i = 0; i < n; i++)
        printf("%d ",arr[i]);
    return 0;

}

参考视频Andy讲解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值