您的位置:首页 > 其它

P1177 【模板】快速排序

2020-01-13 12:30 120 查看

题目描述

利用快速排序算法将读入的N个数从小到大排序后输出。

快速排序是信息学竞赛的必备算法之一。对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成。(C++C++选手请不要试图使用STL,虽然你可以使用sort一遍过,但是你并没有掌握快速排序算法的精髓。)

输入格式

第1行为一个正整数N,第2行包含N个空格隔开的正整数ai,为你需要进行排序的数,数据保证了A_i 不超过10000000001000000000。

输出格式

将给定的N个数从小到大输出,数之间空格隔开,行末换行且无空格。

输入输出样例
输入
54 2 4 5 1
输出
1 2 4 4 5
说明/提示

对于20%的数据,有N≤1000N≤1000;

对于100%的数据,有N≤100000N≤100000

思路:开始没想太多,直接有套用了快排的模板,把最左边的那个数作为基数不断递归调用函数进行排序,发现五组数据中之过了前面两组,后面三组都是超时了。
后来就对代码进行了改进,在选取基数的时候用了随机的方法,但是在代码中没有关闭c中的输入输出流,导致最后还有一组数据没有过。
最后一次尝试就是加上了

std::ios::sync_with_stdio(false);
成功ac该题。

#include<bits/stdc++.h>
using namespace std;

void quickSort(int a[], int left, int right)
{
if (left >= right)
return;
int i = left, j = right, pivot = rand() % (right - left + 1) + left;
swap(a[left], a[pivot]);
while (i < j)
{
while (j > i && a[j] >= a[left])
j--;
while (i < j && a[i] <= a[left])
i++;
swap(a[i], (i == j) ? a[left] : a[j]);
}
quickSort(a, left, i-1);
quickSort(a, j+1, right);
}
int main()
{
int n;
std::ios::sync_with_stdio(false);
cin>>n;
int a[n+10];
for(int i=1; i<=n; i++)
{
cin>>a[i];
}
quickSort(a,1,n);
for(int i=1; i<n; i++)
{
cout<<a[i]<<" ";
}
cout<<a[n]<<endl;
return 0;
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
老赵冲冲冲!!! 发布了71 篇原创文章 · 获赞 0 · 访问量 1128 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: