啥也不说了 上代码, 注释很直白 我就不多说了
#include <stdio.h>
int a[11],n;//定义全局变量,这两个变量需要再子函数中使用
void quicksort(int left ,int right)
{
int i,j,t,temp;
if(left>right)
return;
temp=a[left];//temp中存的就是基准数
//i,j哨兵
i=left;
j=right;
while(i!=j)
{
//顺序很重要,先从右往左找(j哨兵先走)
while(a[j]>=temp && i<j)
j--;
//再从左往右找
while(a[i]<=temp && i<j)
i++;
//交换两个数在数组中的位置
if(i<j)//当哨兵i和j没有相遇时,找到的复合条件的数进行交换
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
//最终将基准数归位
a[left]=a[i];//此时相遇了
a[i]=temp;//进行相遇后到交换
quicksort(left, i-1);//继续处理左边的,这是一个递归过程
quicksort(i+1, right);//继续处理右边的,这是一个递归过程
}
int main()
{
int i,j=0;
//写入数据
while(1)
{
scanf("%d",&n);
if(n!=0)
{
a[j++]=n;
}
else break;
}
quicksort(0, j-1);//下标要对应
for(i=0;i<j;i++)
{
printf("%d ",a[i]);
}
return 0;
}
简单捋一下快速排序思想:以基准数为参考(最右端或者最左端的数),左小右大,哨兵i,j,j先走找小于基准数的家伙,找到了就停那。然后i走找大于基准数的家伙,找到了且没相遇就交换。最终会相遇,相遇后基准数与相遇的位置的那个数交换(基准数归位),然后重复此过程(递归)。具体参考(啊哈算法 第一章的快速排序)