排序的稳定“因素”是什么?

时间:2015-12-30 03:43:01

标签: algorithm sorting

最近,我一直在学习各种排序方法,其中很多都是不稳定,即选择排序,快速排序,堆排序。 我的问题是:使排序不稳定的一般因素是什么?

3 个答案:

答案 0 :(得分:1)

大多数有效的排序算法都是有效的,因为它们可以在更长的距离上移动数据,即每次移动都更接近最终位置。这种效率导致分选中的稳定性丧失。 例如,当您执行类似冒泡排序的简单排序时,您可以比较和交换相邻元素。在这种情况下,如果元素已经按正确顺序排列,则很容易移动元素。但是在快速排序的情况下,分区过程可能会选择说移动,因此交换是最小的。例如,如果在数字2上对下面的列表进行分区,最有效的方法是将第一个元素与第四个元素交换,将第二个元素与第五个元素交换

  

2 3 1 1 1 4
  1 1 1 2 3 4

如果你注意到,现在我们已经改变了列表中1的序列,导致它不稳定。

总而言之,一些算法非常适合稳定排序(如冒泡排序),而其他一些算法如快速排序可以通过仔细选择分区算法来保持稳定,尽管以效率或复杂性为代价或者两者。

我们通常根据最自然的"将算法分类为稳定或不稳定。实施它。

答案 1 :(得分:1)

当使用元素的原始顺序来破坏新排序中的关系时,排序算法是 stable 。例如,假设您有(name, age)的记录,并且您希望按年龄对它们进行排序。

如果您在(Matt, 50), (Bob, 20), (Alice, 50)上使用稳定排序,则会获得(Bob, 20), (Matt, 50), (Alice, 50)。 Matt和Alice记录具有相同的年龄,因此根据排序标准它们是相等的。稳定的排序保留了它们原来的相对顺序--Mat在原始列表中出现在Alice之前,所以它出现在Alice的输出之前。

如果您在同一列表中使用不稳定排序,则可能获取(Bob, 20), (Matt, 50), (Alice, 50),或者您可能会获得(Bob, 20), (Alice, 50), (Matt, 50)。比较相等的元素将组合在一起,但可以按任何顺序出现。

有一个稳定的排序通常很方便,但稳定的排序实现必须记住有关元素原始顺序的信息,同时重新排序它们。

就地数组排序算法的设计不使用任何额外的空间来存储此类信息,并且它们在工作时会破坏原始排序。像quicksort这样的快速通常不稳定,因为以保持原始顺序来破坏关系的方式重新排序数组的速度很慢。插入排序或选择排序等慢速数组排序算法通常可以毫无困难地编写为稳定。

将数据从一个地方复制到另一个地方或与其他数据结构(如链接列表)一起使用的排序算法既快速又稳定。合并排序是最常见的。

答案 2 :(得分:0)

如果您有

的示例输入
  
    

1 5 3 7 1

  

您希望在1之前保持最后1的稳定。

通常,输入数组中具有相同值的元素在排序后不会更改其位置。

然后排序看起来像:

  
    

1(f)3 5 7 1(l)

  

f:首先,l:最后(如果超过2,则为秒)。

例如,QuickSort使用交换,并且因为比较使用而不是(> =)或更少而不是,所以在排序时可以交换同等价值的元素。结果就是输出。