知识点
例如:对“6 1 2 7 9 3 4 5 10 8”这十个数进行排序
代码如下:
#include<stdio.h>
int a[101],n;
void quicksort(int left,int right)
{
int i,j,t,temp;
if(left>right)
return ;//保证左边的"哨兵"比右边的"哨兵"小
temp=a[left];//temp中存的是基准数
i=left;
j=right;
while(i!=j)
{
//先从右往左找
while(a[j]>=temp&&i<j)
{
j--;
}
//再从左往右找
while(a[i]<=temp&&i<j)
{
i++;
}
//交换两个数在数组中的位置
if(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);//处理右边的,递归
return ;
}
int main()
{
int i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
quicksort(1,n);//调用函数
for(i=1;i<=n;i++)
{
printf("%d ",a[i]);
}
return 0;
}
方法:第一步:确定一个基准数
第二步:设立两个“哨兵”分别从数组两边开始探索
详细“探索”过程:先从右往左找一个小于基准数的数,再从左往右找一个大于基准数的值,将其进行交换,交换之后继续前进,直到第一轮“探索”结束,此时以基准数为界左边的数均小于基准数,右边的数均大于基准数。
第三步:经过前面的第一轮探索,排序已经初具雏形,再次按照前面的探索步骤分别将左右两边分别排序,这是就可以采用递归啦;
最后排序就完成了。