#include <iostream>
using namespace std;
#define N 10
int a[N] = {3,6,9,1,2,5,7,4,0,8};
void quick(int left, int right)
{
int sign = a[left];
int i = left;
int j = right;
if(left > right)
return ;
while (i != j)
{
while (i < j && sign <= a[j])//从右往开始找到此时数组中比第一个数小的位置的坐标j
j--;
while (i < j && sign >= a[i])//从左往开始找到此时数组中比第一个数大的位置的坐标i
i++;
if (i < j)//将i和j对应数组的数值交换
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
//以上while循环结束后,得到他们的交遇点i
int tmp1 = a[i];//将此时数组的第一个数和交遇点i对应数组的数值交换
a[i] = a[left];
a[left] = tmp1;
quick(left,i-1); //将此时数交遇点i-1之前数组进行排序
quick(i+1,right);//将此时数交遇点i+1之后数组进行排序
}
int main()
{
for (int i =0; i < N; i++)
cout<<a[i]<< " ";
cout<<endl;
quick(0, N-1);
for (i =0; i < N; i++)
cout<<a[i]<< " ";
cout<<endl;
return 0;
}
快速排序的解题思路
先从数组右边开始往左找到比第一个数小的做标记①
然后从数组左边开始往右找到比第一个数大的做标记②
之后交换这俩个数
继续从标志①往左搜索,再从标志②往右搜索,
如果标志①和标志②未相遇,继续重复以上步骤
直到标志①和标志②到达同样位置
首地址和标志③交换
以标志③为中心,分开成两个部分,分别处理,也就说两个数组分别重复以上步骤