首先,我们随便找一个基准数来比较,通常为了方便,我们会以第一个数为基准数。
在初始状态下,我们会将14挪到中间的某个位置,也就是左边的小于14,右边的大于14,那怎么能做到左边小于14,右边大于14呢?
首先从右往左找,找到一个比14小的数,找到了,就停下来,将它赋值到14这个位置,,假设这个位置是i,接着再从左往右找,找到一个比14还大的数,找到了就停下来,将他赋值到上次那个从右往左找比14还小的数的那个位置i.这还没结束,我们要继续找,直到左边和右边相遇,就把14赋值给这个相遇的地方。
t
到此,14就归位了,接下来我们也要对每个数进行归位,那也就是我们可以对左边进行排序,然后再对右边进行排序,先处理3 0 12,再处理右边56 89 32 99 112 43,我们利用递归即可实现这个过程.
#include<stdio.h>
void Quentsort(int arr[],int left,int right)
{
int i=left;
int j=right;
int temp=arr[i];
if(i>j) //递归结束条件
{
return;
}
else
{
while(i<j)
{
while(i<j&&temp<arr[j])
{
j--;
}
if(i<j)
{
arr[i++]=arr[j];
}
while(i<j&&temp>arr[i])
{
i++;
}
if(i<j)
{
arr[j--]=arr[i];
}
}
}
arr[j]=temp;
Quentsort(arr,left,i-1); //递归左边
Quentsort(arr,i+1,right); //递归右边
}
int main()
{
//int arr[]={14,0,89,12,56,3,32,99,112,43};
int i,j,arr[100000];
scanf("%d",&j);
for(i=0;i<j;i++)
scanf("%d",&arr[i]);
Quentsort(arr,0,j-1);
for(i=0;i<j;i++)
{
printf("%d ",arr[i]);
}
return 0;
}