首页 新闻 会员 周边

快速排序是稳定的吗?

1
悬赏园豆:10 [已解决问题] 解决于 2012-07-15 14:02

算法导论第2版中快速排序中

数组划分算法

PARTITION(A, p, r)

  x <- A[r]

  i <- p-1

  for j <- p to r-1

    do if A[j] ≤ x

         then i = i +1

           exchange A[i]  ↔ A[j]  

  exchange A[i + 1]  ↔ A[r]

  return i + 1

个人认为这种数组分割可以保证稳定性?哪位大侠能帮我解答一下??举出个反例呗?

大兔子_快跑的主页 大兔子_快跑 | 初学一级 | 园豆:104
提问于:2012-06-15 10:56
< >
分享
最佳答案
1

不是稳定的,比如待排序数组为5,7,7,1,1。那么若以数组中第一元素做为换分依据,第一次划结果为1,1,5,7,7。但是(从左往右)第一个7和第二个1交换,第二个7和第一个1交换,所以交换后1和1,7和7的相对位置都变了,所以显然是不稳定的。。

不知道这个解释您是否满意呢??

祝您好运!!!

收获园豆:10
VincentPass | 菜鸟二级 |园豆:238 | 2012-07-14 10:59

现在明白了为啥不稳定了。该算法只能保证从p到中枢元素的最终位置q是稳定的。但是不能保证从中枢元素的最终位置q到r之间元素是不稳定的。书中的例子是初始序列2,8,7,1,3,5,6,4,通过以4为中枢元素,数组划分后结果为2,1,3,4,7,5,6,8。 8相对于7,6,5位置发生了变化。谢谢你哈~~~

大兔子_快跑 | 园豆:104 (初学一级) | 2012-07-15 14:02
其他回答(1)
0

如果你说的稳定是指出错的概率,那么是0,快速排序算法都是经过验证的,如果说算法复杂度,这个是有数学公式做保证的,最坏的情况也是高效的。

today4king | 园豆:3499 (老鸟四级) | 2012-06-18 13:53

不好意思,你可能理解错了。排序算法稳定定义是:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。还是很感谢您的回复,我是菜鸟一个,自学算法ing。

支持(0) 反对(0) 大兔子_快跑 | 园豆:104 (初学一级) | 2012-06-18 21:44

@piraterabbit: 学习了,当年白学了这本书,这个概念一点印象都没了,我特地查了下资料,快速排序是不稳定的:

快速排序有两个方向,左边的i下标一直往右走,当a[i] <= a[center_index],其中center_index是中枢元素的数组下标,一般取为数组第0个元素。而右边的j下标一直往左走,当a[j] > a[center_index]。如果i和j都走不动了,i <= j, 交换a[i]和a[j],重复上面的过程,直到i>j。交换a[j]和a[center_index],完成一趟快速排序。在中枢元素和a[j]交 换的时候,很有可能把前面的元素的稳定性打乱,比如序列为 5 3 3 4 3 8 9 10 11,现在中枢元素5和3(第5个元素,下标从1开始计)交换就会把元素3的稳定性打乱,所以快速排序是一个不稳定的排序算法,不稳定发生在中枢元素和 a[j] 交换的时刻。

支持(0) 反对(0) today4king | 园豆:3499 (老鸟四级) | 2012-06-19 16:56

@今昭: 但是算法导论里快速排序伪代码(问题贴出来的代码)中,i和j的方向都是从左往右的。现在明白了为啥不稳定了。该算法只能保证从p到中枢元素的最终位置q是稳定的。但是不能保证从中枢元素的最终位置q到r之间元素是不稳定的。书中的例子是初始序列2,8,7,1,3,5,6,4,通过以4为中枢元素,数组划分后结果为2,1,3,4,7,5,6,8。 8相对于7,6,5位置发生了变化。

支持(0) 反对(0) 大兔子_快跑 | 园豆:104 (初学一级) | 2012-07-15 14:01

@今昭: 谢谢了~~~~

支持(0) 反对(0) 大兔子_快跑 | 园豆:104 (初学一级) | 2012-07-15 14:04
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册