描述
小鲁虽然编程能力很一般,但是嘴皮子上不服输。他很喜欢拿自己不懂的问题考小华。
刚学会冒泡排序的他,决定挑战一下小华的智商:
给定你一个长度为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讲解