不是稳定的,比如待排序数组为5,7,7,1,1。那么若以数组中第一元素做为换分依据,第一次划结果为1,1,5,7,7。但是(从左往右)第一个7和第二个1交换,第二个7和第一个1交换,所以交换后1和1,7和7的相对位置都变了,所以显然是不稳定的。。
不知道这个解释您是否满意呢??
祝您好运!!!
现在明白了为啥不稳定了。该算法只能保证从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,快速排序算法都是经过验证的,如果说算法复杂度,这个是有数学公式做保证的,最坏的情况也是高效的。
不好意思,你可能理解错了。排序算法稳定定义是:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。还是很感谢您的回复,我是菜鸟一个,自学算法ing。
@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] 交换的时刻。
@今昭: 但是算法导论里快速排序伪代码(问题贴出来的代码)中,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位置发生了变化。
@今昭: 谢谢了~~~~