首先,我们需要知道快速排序的理论知识。快速排序,又名快排,嗯,具体实现是从以数组中第一个数据为基点,然后首先以数组的右边开始(至于为什么是从右边开始,后面会提)寻找比此基点小的(看你的需求,如果是要从小到大的话,就是从右边找比基点小的)数,然后退出来,再从数组最左边开始找,找比基点大的,我们这样一直递归下去,因为我们想要达到的是数组左边的数据都是比基点小右边都是比基点大的,最后把基点放入左右边的中点。随着递归的一点点深入,分割的数目也越来越少,这就达成了一个排序的效果。
为什么要从右边开始寻找呢,首先我们要明确我们是为了排序而交换的,所以我们的交换是最终为了达成一个排序的效果。试想以下,如果是从左边开始找,如果找到的数比中间的右边第一个还要小,那我们怎么去交换呢?因为如果这样子再去交换的话,就会使排序发生错误。
这是我从一个博客中看到的,觉得说的很好,“可以看出, 被交换的对象, 总是当前区间内的极左超重与极右超轻, ( 这个极左超重必须位于极右超轻的左侧)接下来会对处于两者中间的剩余区间进行同样的处理, 这样一个回合下来, 本区间汇合点左边都是超轻, 右边都是超重了”,原因大致就是这样了。
#include <iostream>
#include <cmath>
#include <memory.h>
#include <algorithm>
using namespace std;
int a[111111];
void fast(int left,int right)
{
if(left>right)
return;
int l=left,r=right,temp=a[left];
while(l<r)
{
while(l<r&&temp<=a[r])
r--;
while(l<r&&temp>=a[l])
l++;
if(l<r)
{
int t=a[l];
a[l]=a[r];
a[r]=t;
}
}
a[left]=a[l];
a[l]=temp;
fast(left,r-1);
fast(r+1,right);
}
int main()
{
int n;
cin >>n;
for(int i=0;i<n;i++)
cin >>a[i];
fast(0,n-1);
for(int i=0;i<n;i++)
if(i==n-1)
cout <<a[i]<<"\n";
else
cout <<a[i]<<" ";
}