轮到我的快速排序

说到为什么要用快速排序,只能说源于一个排序的模板问题,也起源于课堂,让我重新拿起了算法。这是一个关于亿级的寻找中位数的问题,我就在CSDN里开始寻找题解,找到了两种解决方式,一种是桶排,另外一种就是快速排序。
在洛谷里我又看到了一个需要快速排序的题目,因此,去了解了一下。
题目描述
利用快速排序算法将读入的NN个数从小到大排序后输出。
题目就是这样的

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

输入格式 第11行为一个正整数NN,第22行包含NN个空格隔开的正整数a_ia i ​ ,为你需要进行排序的数,数据保证了A_iA i
​ 不超过10000000001000000000。

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

输入输出样例 输入 #1 复制 5 4 2 4 5 1 输出 #1 复制 1 2 4 4 5 说明/提示
对于20%20%的数据,有N≤1000N≤1000;

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

以下是自己参照别人写出的题解。

#include
using namespace std;
int a[1000001],n;
void quicksort(int x, int y)
{ int k=a[(x+y)/2];
int i=x,j=y;
do{
while(a[i]<k) i++; while(a[j]>k) j–; if(i<=j) {
swap(a[i],a[j]); i++; j–; }
}while(i<=j);
if(x<j)
quicksort(x,j);
if(i<y) quicksort(i,y); }

int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
quicksort(1,n);
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
}

其实这里用的不是模板的快排,使用了中间的数作为比较的对象。快速排序它实际上是从一列数字的左右两端开始,选最左的一个数字作为一个基准,找出与其比较大的数和小的数分别划分到基准的两边,得到新的两列数,再重复同样的操作。最终排序成功。

写到这,我到是想到了一些内容,指数级的是讨厌的,要降低为多项式级的。我们的排序问题其实也属于组合优化的一种,它就是一种数学问题,我们在达到某一目的的过程的优化方法就是一种算法。而基于优化的路径与优化对象,我们提出了不同的编程思维。这倒是挺哲学的,也有一种认知事物的感觉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值