简单重温快速排序法(QuickSort)

更多算法,请我的网站: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的台湾人的原话:

 


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值