参考:《啊哈算法》《C语言进阶重点、难点与疑点解析》

1.快排推导过程
比如,让下列的6 1 2 7 9 3 4 5 10 8进行一个升序排列
快速排序_其他
下面的基数6归位,表示的第一次快排的结果,下面介绍下第一次快排的重点操作:

这里,我们将6作为基数,一定要先先从右往左找一个小于6的数,再从左往右找一个大于6的数,接下来的将3作为基数,也要从右边开始找!
当从两边遍历的结果相遇了,那么就将基数与相遇的数字进行交换即可。
快速排序_其他_02

快速排序_升序_03

2.快排的核心思想

先找到一个基数(若是最左边的为基数,升序排列),从右边开始寻找小于基数的数字,然后从左边开始寻找大于基数的数,找到了就交换,直到这两端遍历的i和j碰头为止。

3.时间复杂度
N:需要排序的元素个数
最差时间复杂度O(N^2);
平均时间复杂度O(NlogN),这里的log是以3为底

4.代码eg:
升序排列的话

#include<stdio.h>
#include<stdlib.h>

int data[101],n;
void quick(int left,int right)
{
	int i=left;
	int j=right;
	
	if(left>right)
		return;
	
	int base=data[left];
	
	while(i!=j)
	{
		//一定要先从右边开始寻找
		while(data[j]<=base && i<j)
			j--;
		//再从左边开始寻找
		while(data[i]>=base && i<j)
			i++;
		if(i<j)
		{
			int t;
			t=data[j];
			data[j]=data[i];
			data[i]=t;
		}		
			
	}
	//基数归位
	if(i==j)
		data[left]=data[i];
		data[i]=base;
	
	quick(left,i-1);
	quick(i+1,right);	
}

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&data[i]);
	
	quick(1,n);
	
	for(int i=1;i<=n;i++)
		//scanf("%d",&data[i]);
		printf("%d",data[i]);
	
	return 0;
}