Quicksort不稳定,因为它交换不相邻的元素。
请帮助我理解这句话。
我知道分区是如何工作的,以及稳定性是什么。但我无法弄清楚是什么导致上述不稳定的原因? 然后我相信合并排序也是如此 - 尽管它被引用为一种稳定的算法。
答案 0 :(得分:34)
考虑在分区期间为以下数组对发生的情况,其中比较器使用整数(仅)。字符串就在那里,所以我们有两个元素比较,如同相等,但实际上是可区分的。
(4, "first"), (2, ""), (3, ""), (4, "second"), (1, "")
根据定义,排序是稳定,如果在排序之后,两个比较好的元素(两个4
s)之后以相同的顺序出现,就像之前一样
假设我们选择3
作为支点。两个4
元素将在它之后以及它之前的1
和2
结束(它比它更多,我忽略了移动枢轴,因为它已经在正确的位置,但你说你理解分区)。
一般来说,Quicksorts在两个4
的分区之后不会给出 where ,并且我认为大多数实现都会反转它们。例如,如果我们使用Hoare's classic partitioning algorithm,则数组按如下方式进行分区:
(1, ""), (2, ""), (3, ""), (4, "second"), (4, "first")
违反了分拣的稳定性。
由于每个分区都不稳定,因此整体排序不太可能。
正如Steve314在评论中指出的那样,合并排序是稳定的,前提是合并时,如果你遇到相同的元素,你总是首先输出来自你合并在一起的两半的“下部”的那个。也就是说,每个合并必须看起来像这样,其中“左”是来自原始数组中较低位置的一侧。
while (left not empty and right not empty):
if first_item_on_left <= first_item_on_right:
move one item from left to output
else:
move one item from right to output
move everything from left to output
move everything from right to output
如果<=
为<
,则合并将不稳定。
答案 1 :(得分:4)
它就像用户有一个排序数组,并按另一列排序,排序算法是否始终保留不同于前一个排序键但在新排序键中具有相同值的元素的相对顺序? 因此,在总是保留元素顺序(在新的排序键中没有区别)的排序算法被称为&#34;稳定排序&#34;。
答案 2 :(得分:1)
考虑以下数组:
{(4,'first');(2,'');(1,'');(4,'second');(3,'')}
将3视为枢轴。在快速排序运行期间,阵列会发生以下变化:
{(4,'first');(2,'');(1,'');(4,'second');(3,'')}
{(2,'');(4,'first');(1,'');(4,'second');(3,'')}
{(2,'');(1,'');(4,'first');(4,'second');(3,'')}
{(2,'');(1,'');(3,'');(4,'second');(4,'first')}
{(1,'');(2,'');(3,'');(4,'second');(4,'first')}
显然,从上面可以看出,相对顺序发生了变化。这就是为什么快速排序被称为“不能确保稳定性”的原因。
答案 3 :(得分:0)
如果保留等效项的顺序,则排序是稳定的。 快速排序的稳定性取决于分区策略。 “ Quicksort不稳定,因为它交换不相邻的元素。”该语句取决于使用Hoare分区的先决条件。 这是来自伯克利CS61b,Hoare Partitioning
的hoare parting演示您应该知道“它交换不相邻元素”的含义。