快速排序法就是在数字里面选择一个基准数,我们记为A,这个基准数一般选择第一个数字,这样比较简单。然后我们从这个数列的两端开始探测,从右边找到比基准数小的数,我们记为B,从左边找到比基准数大的数字,记为C。但当他们探测还没有遇到一起的时候,这此时交换B和C。如果他们探测撞到一块,此时他们都指向同一个数字,记为D, 这个时候,D左边的所有数字都比A大,D右边的所有数字都比A小。则此时我们将D和A互换。
现在开始第一次探测。从左开始探测,首先c发现1比3小,c便停下来,B开始探索,B发现7大于3,B停下了。
此时B,C互换。第一次探测结束,结果如下:
接下来继续探测,C探测5时,5大于3,继续向左探测,直到C探测到2比3小时,停止。B开始向右探测,发现4大于3,则B停止,B,C互换值。互换之后结果为:
C开始继续向左探测,直到单侧到2时,C停下来了。由于此时B和C撞到一块,于是,和基准数互换。
互换后为,此时基数3已结归位。接下来以2作为新的基准数。此时第一轮的探测就结束了。
快速排序法要用到递归,现在要分别对3的左边和右边进行排序,首先对3左边的2和1进行排序。如下,然后跟前面的方法一样。
2和1排序结束后,整体顺序为:
现在我们要对3右边的数字进行排序。这时是以9位基准数。
方法和前面一样。C向左探测,发现7比9小,停止下来。B向右探测,寻找大于9的数字,直到B和C相遇,于是9和7交换。
根据递归,于是又对9左边的数字7,4,5进行排序,方法和前面的2和1排序方法相同。
最终排序结果如下:
通过测试程序,我们可以看到每次递归后的排序顺序。
#include<stdio.h>
#define N 10
int num[N];
int quick_sort(int L,int R)
{
int left=L,right=R;
int i;
int base=num[L];
int temp;
if(L>R)
return 0;
while(right!=left)
{
while(num[right]>=base&&right>left)//寻找右边小于base的值
{
right--;
}
while(num[left]<=base&&right>left)//寻找左边大于base
{
left++;
}
//如果没有相遇,这左右值交换
if(right>left)
{
temp=num[left];
num[left]=num[right];
num[right]=temp;
}
for(i=1;i<=R;i++)
printf("%d\t",num[i]);
printf("\n");
}
//当左右相遇,基数归位
num[L]=num[right];
num[left]=base;
//num[R]=base;
quick_sort(L,left-1);
quick_sort(right+1,R);
}
int main()
{
int i=0,n=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&num[i]);
//排序
quick_sort(1,n);
for(i=1;i<=n;i++)
printf("%d\t",num[i]);
return 0;
}
最后附上完整代码:
#include<stdio.h>
#define N 10
int num[N];
int quick_sort(int L,int R)
{
int left=L,right=R;
int i;
int base=num[L];
int temp;
if(L>R)
return 0;
while(right!=left)
{
while(num[right]>=base&&right>left)//寻找右边小于base的值
{
right--;
}
while(num[left]<=base&&right>left)//寻找左边大于base
{
left++;
}
//如果没有相遇,这左右值交换
if(right>left)
{
temp=num[left];
num[left]=num[right];
num[right]=temp;
}
}
//当左右相遇,基数归位
num[L]=num[right];
num[left]=base;
//num[R]=base;
quick_sort(L,left-1);
quick_sort(right+1,R);
}
int main()
{
int i=0,n=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&num[i]);
//排序
quick_sort(1,n);
for(i=1;i<=n;i++)
printf("%d\t",num[i]);
return 0;
}