快速排序

1.排序原理

任意取序列中的一个数据key值,分别从序列左右两边开始遍历,将小于key值的数据放在key值左边,将大于key的数据放在key值右边,于是我们得到一个以key值作为中间值的序列,然后我们利用递归思想在对key值左右俩个子序列分别重复以上操作,从而达到排序效果

<mark>排序过程如图</mark>

数组:num[5]={3,5,1,2,4}
key=3
i=0		{[3],5,1,2,[4]}		j=4	初始状态
i=0		{[3],5,1,[2],4}		j=3	右遍历,num[j]<key
i=0		{[2],5,1,[2],4}		j=3 右换位,num[i++]=num[j]
i=1		{2,[5],1,[2],4}		j=3 左遍历,num[i]>=key
i=1		{2,[5],1,[5],4}		j=3 左换位,num[j--]=num[i]
重复:
i=1		{2,[5],[1],5,4}		j=2 右遍历
i=1		{2,[1],[1],5,4}		j=2 换位,num[i++]=num[j]
i=2		{2,1,[[1]],5,4}		i=2	(i=j)跳过左遍历和左换位
结束循环,设置中间值:num[i]=key {2,1,3,5,4}

递归左右子序列:
左序列:{2,1}(key=2)		右序列{5,4}(key=5)
左序列					右序列
	重复....{1,2}			重复....{4,5}	
排序完成
{1,2,3,4,5}

2.源代码

#include<stdio.h>
#define N 10
void qsort(int num[],int L,int R)
{
	if(L<R)//递归结束条件
	{
		int i=L;//从数组左边开始遍历
		int j=R;//从数组右边开始遍历
		int key=num[L];//默认取数组第一个数为中间值
		while(i<j)
		{
			while(i<j&&num[j]>=key)//当num[j]就在key的右边
				j--;//向后遍历,直到i>=j或者num[j]<key时结束
			if(i<j)//以上while循环后如果i依然小于j,即num[j]<key
				num[i++]=num[j];//将num[j]放在左边
			while(i<j&&num[i]<key)//当num[i]在key的左边
				i++;//向前遍历
			if(i<j)//num[i]>=key
				num[j--]=num[i];//将num[i]放到右边
		}
		num[i]=key;//最后key作为中间值放在遍历结束的num[i]处
		qsort(num,L,i-1);//递归key值左边的子序列
		qsort(num,i+1,R);//递归key值右边的子序列
	}
}
int main()
{
	int num[N]={9,8,7,6,5,4,3,2,1,0};
	qsort(num,0,N-1);
	for(int i=0;i<N;i++)
		printf("%d",num[i]);
	printf("\n");
	return 0;
}