理解
初始状态如上图,设置两个指针low和high,设置变量temp作为比较依据。
算法过程如下:
(1)首先从末尾向前比较,①arr[high] >= temp,那么high–,继续从末尾向前比较。②arr[high] < temp,那么arr[low] = arr[high],之后low++;
(2)从前向后比较,①arr[low] <= temp,那么low++,继续向后比较。②arr[low] > temp,那么arr[high] = arr[low],之后high–,继续比较。
循环停止条件是当low和high指针重合时,将temp值填入其中。
完成上述操作实现以temp为划分的两个数组,左边的比他小,右边的比他大,之后递归调用,左右两边都顺序排列,那么排序完成。
第一步将arr[high]赋值给arr[low],low++;
第二步比较arr[low]和temp,将arr[low]赋值给arr[high],high–;
之后不再一一赘述,就是这样一步步实现最终状态是:
之后对左右两边进行递归实现。
如果不理解,可以按照图片自己画一遍就明白了。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
void quickSort(int*a, int start, int end)
{
if(start>=end)
return;
int low = start, high = end;
int temp = a[low];
while(low < high)
{
//这里注意条件ow<high,漏掉就会错
while(low<high&&a[high] >= temp)
high--;
a[low] = a[high];
while(low <high && a[low] <= temp)
low++;
a[high]=a[low];
}
a[low] = temp;
quickSort(a, start, low-1);
quickSort(a,low+1,end);
}
void print(int * a,int start, int end)
{
cout<<endl;
for(int i = start; i <= end; i++)
{
cout<<a[i]<<"\t";
}
}
int main()
{
int a[6] = {23,46,0,8,11,18};
quickSort(a,0,5);
print(a,0,5);
return 0;
}