我知道selection sort
可以实现稳定或不稳定。但我想知道它是怎么回事。我认为排序算法只能稳定或只是不稳定。有人可以解释一下吗?
答案 0 :(得分:47)
基本上在selection sort
中,在每个“回合”结束时发生的交换可以改变具有相同值的项目的相对顺序。
例如,假设您使用4 2 3 4 1
对selection sort
进行了排序。
第一个“圆”将遍历每个元素,寻找最小元素。它会发现1是最小元素。然后它会将1换成第一个位置。这将导致第一个位置的4进入最后一个位置:1 2 3 4 4
现在4的相对顺序发生了变化。原始列表中的“第一个”4已移到另一个4之后的某个位置。
记住稳定的定义是
保持具有相同值的元素的相对顺序。
嗯,selection sort
通过在一组值中找到“最小”值,然后将其与第一个值交换:
代码:
2,3,1,1#扫描0到n并找到“最小”值
1,3,2,1#与元素0交换'最少'。
1,3,2,1#扫描1到n并找到“最小”值
1,1,2,3#与元素1交换'最少'。
......依此类推,直至排序。
要使其稳定,而不是交换值,请插入“最少”值而不是:
代码:
2,3,1,1#扫描0到n并找到“最小”值
1,2,3,1#在'0'插入“最少”,推回其他元素。
1,3,2,1#扫描1到n并找到“最小”值
1,1,2,3#在pos 1处插入'least',将其他元素推回去。
......依此类推,直至排序。
修改不稳定的选择排序算法以保持稳定不应该太难。
答案 1 :(得分:20)
通常情况下 - 你不正确。选择排序为unstable。这来自它的定义。所以,你显然对一个自定义案例感到困惑。
可以稳定 - 通常只有linked lists。要做到这一点(经典的方式,O(1)内存) - 而不是交换,最小元素必须链接到未排序的部分,使整个算法稳定。这就是“实施”的不同之处 - 显然,由于数据结构的具体情况,这种情况只能在这种情况下产生稳定性。当选择排序不稳定
时,它与常见情况无关答案 2 :(得分:5)
假设我有这个数组:
A = {3, 3, 1}
从位置0开始,选择排序将搜索最小值并使用最小值交换当前元素。对于A
,我们将第一个3
与1
交换,并在第二步中不执行任何操作。
这不稳定,因为第一个3
应该在第二个之前。如果使用链表而不是数组,并将元素插入正确的位置而不是交换,则选择排序是稳定的。
答案 3 :(得分:0)
排序路由是一种选择排序的事实并没有定义关于它的所有内容。在不同的实现中仍然可以做出不同的决定,并且不同的选择可以产生稳定或不稳定的排序。 (大多数可以稳定的类型不一定;通常,有趣的理论问题是是否可以稳定实施。)
答案 4 :(得分:0)