更多算法,请我的网站:http://www.comiscience.com
In-place 的快排方法。
例子 :
原始序列数: 3 7 8 5 2 1 9 5 4
1、选取中间的5,将5与最后的4互掉位置,生成新的序列:
3 7 8 4 2 1 9 5 5
2、我们把比上面5 小的数集中排到比5 大的数的前面,我们使用最快地方法:
- 从第一个元素3和最后一个元素5 比较,发现3小于5,则用3和3互换,但发现是同一元素,所以不动,序列不变。
- 拿第2个元素7和5 比较,发现7大于5 ,则7不变。
- 拿第3个元素8和5 比较,发现仍然大于,则8不变。
- 拿第4个元素4和5 比较,发现小于5 ,则4和7交换位置,序列变为了:3 4 8 7 2 1 9 5 5
- 拿第5个元素2和5 比较,发现小于5 ,则2和8交换位置,序列变为了:3 4 2 7 8 1 9 5 5
- 拿第6个元素1和5 比较,发现小于5 ,则1和7交换位置,序列变为了:3 4 2 1 8 7 9 5 5
- 拿第7个元素9和5 比较,发现大于5 ,则9不变。
- 拿第8个元素5和5 比较,发现相同,则新的序列变为:3 4 2 1 5 7 9 8 5
- 从头到尾对比一遍之后,我们把 5 和7兑换位置,新的序列变为: 3 4 2 1 5 5 9 8 7
到此为止,5 左边的数都小于它,右面的数都大于它。
3、我们将上面5左右两边的序列分开,作序列为3 4 2 1 5 右序列为9 8 7。我们对这左右两个序列重复上面1、2部的操作。我们可以得到如下序列:
左序列: 1 2 4 5 3 右序列:7 8 9
4、我们再次重复1、2步的操作,将第3步后的新的分序列排序:序列1: 1 ; 序列2: 4 5 3 ; 序列3: 7 ; 序列4: 9;
5、按照1、2、3步骤,我们逐步的对子序列排序,最后我们得到排序后的最终序列 1 2 3 4 5 5 7 8 9
算法:
上面的过程如果不是很明白,我们看下面的算法。上面的例子中,选取重点 标示的数字都是随机选择的,看下面的算法尽量理解。
时间复杂度:
平均为:O(n log n )
最糟情况为: O (n2 )
这个不能想象,假设每个序列都分为两个序列,一直到每个序列都只有1个元素的时候,这个的复杂度是 log n
每次分序列后,从新排列的元素,就是从左到有的所有元素,是n
每次为n,一共有 log n 次,那时间复杂度就是 O(n log n )
最早情况也很容易,假设一个序列有8个元素,每次运行函数 partition之后,总是有一个序列里只有一个元素,那么相当于我们一共分了n次,每次要排n个元素,所以最后是n*n。
如果大家看不懂,我下面引用wiki的台湾人的原话: