为什么选择排序不稳定?

问题描述 投票:0回答:4

这可能是微不足道的,但我不明白为什么选择排序的默认实现不稳定?

在每次迭代中,您都会找到剩余数组中的最小元素。当找到这个最小值时,您可以选择找到的第一个最小值,并且仅当元素实际上小于它时才更新它。因此,每次迭代时选择的元素是第一个最小值 - 这意味着它是先前排序顺序中的第一个。因此,据我了解,当前排序不会破坏先前对相等元素进行排序生成的顺序。

我错过了什么?

algorithm sorting
4个回答
70
投票

一个小例子:

设 b = B

< B > 、 < b > 、 < a > 、 < C > (带有 < b < c)

一个循环后,序列已排序,但 B 和 b 的顺序发生了变化:

< a >、< b >、< B >、< c >

但是,如果您不进行切换,而是插入最小值,则可以稳定地实现选择排序。但为了提高效率,您应该拥有一个支持低成本插入的数据结构,否则您最终会遇到二次复杂度。


22
投票

问题在于选择排序会将数组前面的元素交换到最小元素空出的位置,这可能会打乱排序顺序。例如,假设我正在排序

(4, 0), (4, 1), (1, 0)

选择排序首先将(1, 0)交换到前面:

(1, 0), (4, 1), (4, 0)

现在 (4, 0) 和 (4, 1) 的排序顺序已经乱了。运行完成后,元素将按此顺序排列,而 4 则乱序。

希望这有帮助!


0
投票

选择排序通常是一种不稳定的排序算法。为了理解这一点,让我们考虑一个例子: 数组 = [3a, 7, 5, 3b, 2, 9] 其中 3a = 3b

第一次迭代后 数组 = [2, 7, 5, 3b, 3a, 9]

现在,您可以看到 3a 和 3b 的顺序互换了。你最终会得到如下结果 数组 = [2, 3b, 3a, 5, 7, 9]

这清楚地表明该算法改变了元素的相对顺序,因此是一种不稳定的算法。


-19
投票

稳定意味着如果元素已经排序,则不会进一步计算,但会计算到结束,因此不稳定。

© www.soinside.com 2019 - 2024. All rights reserved.