为什么选择排序可以稳定或不稳定

时间:2013-12-24 12:58:10

标签: arrays algorithm sorting

我知道selection sort可以实现稳定或不稳定。但我想知道它是怎么回事。我认为排序算法只能稳定或只是不稳定。有人可以解释一下吗?

5 个答案:

答案 0 :(得分:47)

基本上在selection sort中,在每个“回合”结束时发生的交换可以改变具有相同值的项目的相对顺序。

例如,假设您使用4 2 3 4 1selection 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,我们将第一个31交换,并在第二步中不执行任何操作。

这不稳定,因为第一个3应该在第二个之前。如果使用链表而不是数组,并将元素插入正确的位置而不是交换,则选择排序是稳定的。

答案 3 :(得分:0)

排序路由是一种选择排序的事实并没有定义关于它的所有内容。在不同的实现中仍然可以做出不同的决定,并且不同的选择可以产生稳定或不稳定的排序。 (大多数可以稳定的类型不一定;通常,有趣的理论问题是是否可以稳定实施。)

答案 4 :(得分:0)

  • 首先,您必须了解选择排序没有任何不稳定的东西,因为它生动地取决于您用于特定的数据结构。
  • 例如,考虑这样一个事实,我们有一个数组 4 2 4 1,在使用传统方法对这个数组进行排序时,结果将是 1 2 4 4 , 简单的。但是在第一轮迭代中,第 0 个索引处的 4 将被放置在最后一个索引处,考虑到稳定性的事实,这在伦理上是错误的,因为第 2 个索引中出现的 4 应该晚于 4出现在第 0 个索引上。 ( 1 2 4[2nd index] 4[from 0th index])
  • 如果被问到!您可以在实现中稍作修改,而不是交换数字,而是在第一轮中选择最小元素,然后将该元素放在正确的位置并移动整个数组。我知道转移操作可能比交换花费更多,但这是我能想到的最好的方法。
  • 如果您担心移位操作,您可以使用链表而不是数组,并在 O(1) 时间内在其适当的位置插入适当的元素。