看一下动图就能粗略懂得快速排序的算法结构了
(1)将数组的第一个数定为 标记
(2)从后面开始比较,若 该数 比 标记数 大,则不管(因为我们的目的就是降序排序);若 该数 比 标记数 小,将该数进行位置转换,调到前面,现在 标记数 的那个位置----即与 标记数 互换位置
(3)再从前面开始比较,同理,若数 比 标记数 小,则不管;若 数 比 标记数 大,将该数进行位置互换,调到后面
以上是主要思路
进行完一次循环后,得到的结果是 在标记数的左端的数比标记数小,在右端的数比标记数大;
此时对 函数进行 递归调用 quick(第一位,i-1位) quick(i+1位,最后一位)
#include<iostream>
using namespace std;
int n;
int sz[100];
void quick(int left,int right)
{
int a,b,temp;
if(left>right)
{
return ;
}
a=left;
b=right;
temp=sz[a];//标记数
while (a<b)
{
while (sz[b]>=temp&&a<b)
{
b--; //如果比他大,符合条件,只需移动光标
}
if(a<b)
{
sz[a]=sz[b]; //将那个小的数提过来,放到他的位置
}
while (sz[a]<=temp&&a<b)
{
a++; //如果比他小,符合条件,只需移动光标
}
if(a<b)
{
sz[b]=sz[a]; //把那个大的拿过来
}
}
sz[a]=temp; //别把标记数忘了,移动之后他在中间
quick(left,a-1); //对左边的数使用函数递归调用,再排序
quick(a+1,right); //对右边的数使用函数递归调用,再排序
}
int main()
{
int i;
cin>>n;
for(i=0;i<n;i++)
{
cin>>sz[i];
}
quick(0,n-1);
for (int j = 0; j < n; j++)
{
cout<<sz[j]<<" ";
}
}