【问题标题】:What type of input differentiates insertion sort from selection sort?什么类型的输入区分插入排序和选择排序?
【发布时间】:2015-12-29 18:17:52
【问题描述】:
  1. 在哪种测试用例中插入排序比选择排序表现更好?清楚地描述测试用例。

  2. 为什么在该测试用例中选择排序的性能比插入排序差?

我这样回答第一个问题:

O(n2)。当插入排序给定一个列表时,它获取当前元素并将其插入到列表的适当位置,每次插入时都会调整列表。这类似于在纸牌游戏中排列纸牌。

还有第二个问题:

因为选择排序总是进行 n(n-1)/2 次比较,但在最坏的情况下它只会进行 n-1 次交换。

但我不确定我的答案,有什么建议吗?

【问题讨论】:

  • 你没有给出问题一的测试用例。
  • 可能我不明白什么是测试用例,你能解释一下吗?
  • 他们想要类似“当输入列表已经按降序排序时,选择排序的性能更差,例如[4,3,2,1]”。 (不知道是不是真的,这只是答案格式的一个例子)
  • 就目前而言,您的问题实际上与 Python 无关;当然,附加特定于版本的标签还为时过早。你说的是排序理论,而不是算法的实现。

标签: sorting time-complexity insertion-sort selection-sort


【解决方案1】:

对于插入排序比选择排序更快的情况,请考虑如果输入数组已经排序会发生什么。在这种情况下,插入排序进行 O(n) 比较并且没有交换。选择排序总是进行 Θ(n2) 比较和 O(n) 交换,因此给定一个相当大的排序输入数组,插入排序将优于选择排序。

对于选择排序优于插入排序的情况,我们需要有点棘手。插入排序的最坏情况是输入数组是反向排序的。在这种情况下,它进行 Θ(n2) 比较和 Θ(n2) 交换。将此与选择排序进行比较,后者总是进行 Θ(n2) 比较和 O(n) 交换。如果比较和交换所用的时间大致相同,那么选择排序可能会比插入排序快,但您必须实际分析它才能找到答案。真的,它归结为实施。在这种情况下,一个好的插入排序实现实际上可能会击败一个糟糕的选择排序实现。

作为一个棘手的解决方案,请尝试创建一个自定义数据类型,其中比较便宜但交换需要非常非常长的时间才能完成。这应该适用于您的第二种情况。

【讨论】:

    猜你喜欢
    • 2015-04-25
    • 2016-02-18
    • 1970-01-01
    • 2013-03-25
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    相关资源
    最近更新 更多