Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 为什么选择排序可以是稳定的或不稳定的_Arrays_Algorithm_Sorting - Fatal编程技术网

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

Arrays 为什么选择排序可以是稳定的或不稳定的,arrays,algorithm,sorting,Arrays,Algorithm,Sorting,我知道,选择排序可以实现为稳定或不稳定。但我想知道这是怎么回事。我认为排序算法只能是稳定的,也只能是不稳定的。有人能解释一下吗?排序路由是选择排序这一事实并不能定义它的全部内容。在不同的实现中仍有可能做出不同的决策,不同的选择可能产生稳定或不稳定的排序。(大多数可以稳定的排序不一定要稳定;通常,有趣的理论问题是排序是否可以稳定实现。)假设我有一个数组: A = {3, 3, 1} 从位置0开始,选择排序将搜索最小值,并用最小值交换当前元素。对于A,我们将第一个3与1交换,第二步不做任何操作 这

我知道,
选择排序
可以实现为稳定或不稳定。但我想知道这是怎么回事。我认为排序算法只能是稳定的,也只能是不稳定的。有人能解释一下吗?

排序路由是选择排序这一事实并不能定义它的全部内容。在不同的实现中仍有可能做出不同的决策,不同的选择可能产生稳定或不稳定的排序。(大多数可以稳定的排序不一定要稳定;通常,有趣的理论问题是排序是否可以稳定实现。)

假设我有一个数组:

A = {3, 3, 1}
从位置0开始,选择排序将搜索最小值,并用最小值交换当前元素。对于
A
,我们将第一个
3
1
交换,第二步不做任何操作


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

基本上在
选择排序中,在每个“轮”结束时发生的交换可以更改具有相同值的项的相对顺序

例如,假设您使用
selection sort
4 2 3 4 1
进行排序

第一轮将遍历每个元素,寻找最小元素。它将发现1是最小元素。然后它将把1换成第一个点。这将导致第一个位置的4变为最后一个位置:
1234

现在4的相对顺序已经改变了。原始列表中的“第一个”4已移动到其他4个之后的位置

记住稳定的定义是

保持具有相同值的元素的相对顺序

好的,
选择排序
的工作原理是在一组值中找到“最小”值,然后将其与第一个值交换:

代码:

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#在位置1处插入“至少”,将其他元素向后推

…等等,直到它被分类


修改不稳定的选择排序算法使其变得稳定应该不太难。

在一般情况下,您是不正确的。选择排序是很重要的。这来自于它的定义。很明显,你对一个定制案例感到困惑

它可以是稳定的-正常情况下,只有使用。要做到这一点(经典的方式,O(1)内存)-而不是交换,最小元素必须链接到未排序的部分,使整个算法稳定。这就是“实现”的不同之处——显然,只有在这种情况下,由于数据结构的特殊性,实现才会产生稳定性。当选择排序不稳定时,它与普通情况无关
  • 首先,您必须了解,选择排序没有什么不稳定的地方,因为它生动地取决于您为特定应用程序使用的数据结构
  • 例如,考虑我们有一个数组,如<强> 4,4,1,< /强>,在使用传统方法对数组进行排序时,结果将是<强> 1,2,4,4,<强>,简单。但在第一轮迭代中,第0个索引中出现的4将被放在最后一个索引中,考虑到稳定性的事实,这在道德上是错误的,因为第2个索引中出现的4应该晚于第0个索引中出现的4(1 2 4[第二索引]4[第0索引])
  • 如果有人问的话!您可以在实现中稍作修改,而不是交换数字,在第一轮中选择最小元素,然后将该元素放置在正确的位置并移动整个数组。我知道转换操作的成本可能比交换要高,但这是我能想到的最好的了
  • 如果您关心移位操作,可以使用链表而不是数组,并在O(1)时间内将适当的元素插入其适当的位置

  • 回答得不错。谢谢但是如果我理解正确的话,使用“插入”而不是“交换”实现的选择排序会偏离其属性,因此它不再是同一个动物。稳定的代价是“插入”的开销远大于“交换”@Alma Do对此主题有更好的解释。解释得好。如果第二个示例(2,3,1,1)在正常算法中不稳定,并且在修改后的算法中稳定,则会更好。无论哪种方式,它都是稳定的。第一个示例更好。