选数组第一个元素为基准数t,先从数组右边j=0找比t大的,j--;从左边i=0找比t小的,i++;交位置;
i=j时,把t=a[i](或a[j]) 。从把数组分左右重复以上操作。
#include<bits/stdc++.h>
using namespace std;
int a[100000],n; //全局变量
void quicksort(int left,int ringht)
{
int i,j,k,t;
if(left>ringht) return;
t=a[left]; //先将基准数保存下来,这里选择左边为基准数
i=left;j=ringht;
while(i!=j)
//先从右往左找,找到比基准数小的数
{
while(a[j]>=t&&i<j)
j--;
//再从左往右找,找到比基准数大的数
while(a[i]<=t&&i<j)
i++;
//如果是找到,而不是i和j相遇了,就交换他们的位置
if(i<j)
{
k=a[i];
a[i]=a[j];
a[j]=k;
}
}
//退出时 i = j 此时将基准数和 i(或j)位置的数交换
a[left]=a[i];
a[i]=t;
//交换完基准数后 继续处理左右的位置
quicksort(left,i-1);
quicksort(i+1,ringht);
return;
}
int main()
{
int i;
cin>>n; //输入数组元素个数
for(int i=0;i<n;i++) //输入数组数据
{
cin>>a[i];
}
quicksort(0,n-1);
for(i=0;i<n;i++)
cout<<a[i]<<" "; //空格间隔输出
return 0;
}