说到为什么要用快速排序,只能说源于一个排序的模板问题,也起源于课堂,让我重新拿起了算法。这是一个关于亿级的寻找中位数的问题,我就在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]<<" ";
}
其实这里用的不是模板的快排,使用了中间的数作为比较的对象。快速排序它实际上是从一列数字的左右两端开始,选最左的一个数字作为一个基准,找出与其比较大的数和小的数分别划分到基准的两边,得到新的两列数,再重复同样的操作。最终排序成功。
写到这,我到是想到了一些内容,指数级的是讨厌的,要降低为多项式级的。我们的排序问题其实也属于组合优化的一种,它就是一种数学问题,我们在达到某一目的的过程的优化方法就是一种算法。而基于优化的路径与优化对象,我们提出了不同的编程思维。这倒是挺哲学的,也有一种认知事物的感觉。