【问题标题】:Sorting - How selection sort is efficient?排序 - 选择排序如何有效?
【发布时间】:2016-10-23 15:35:07
【问题描述】:

最近我正在研究 C# 中基本排序算法的时序分析 Following this Book。 在第 55 页上,作者概括地提到了这一点。

选择排序是最有效的算法,其次是 冒泡排序和插入排序

但实际上,在最佳、正常和最坏情况下,选择排序比插入和冒泡排序花费更多时间。 即使this online algorithm visualisation 显示选择排序需要更多时间。

我的问题是,与插入和冒泡排序相比,选择排序的效率如何?

【问题讨论】:

  • 在什么方面效率最高?可以通过时间、复杂性和内存使用来比较算法。您通常需要用一个换另一个。
  • @ScottChamberlain 作者提到了时间复杂度。
  • 在现实生活中,它取决于读写和比较的相对成本。这三个的时间复杂度都是二次的。
  • @Steve 我已经检查过了,但对书中提到的陈述感到困惑。

标签: algorithm sorting


【解决方案1】:

我认为你过于概括作者的主张了。

在谈到相对效率时,本书作者在非常具体的情况下比较了算法:

  • 他比较了他的具体实现的时间安排,
  • 他比较了特定硬件上的时间
  • 他在一个随机数据集上比较了时间(相对于动画页面,它提供了四种选择)

通过测量这些特定情况下的时间,作者得出结论,当在他的特定硬件上对 10,000 个随机种子元素进行排序时,他的选择排序实现在三种实现中最快。这是他唯一可以合理地提出的主张。特别是,对于作者的实验来说,选择排序是三种方法中效率最高的说法太笼统了。

作者的实验之所以能得到他所展示的排名,很可能是算法的缓存友好性。

选择排序大部分时间都是在一个方向上读,它的大部分操作都是读。另一方面,插入排序会进行大量的写作。冒泡排序在大多数情况下也朝着相同的方向发展,但它混合了写入和读取,并且比选择排序所做的写入更多。简而言之,作者的选择排序实现似乎是针对作者硬件的三种算法中最优化的

【讨论】:

  • 作者应该提到它,因为大多数 C# 新手都在关注这本书并且认为这个陈述是错误的或相反的。
  • 第二点,作者比较了选择排序最快的随机数据的时间,但实际上,插入排序在随机数据上的工作速度更快?根据我的分析?我说的对吗?
  • @MuhammadQasimAshraf 您需要大量数据(数百或数千条记录)才能开始显示缓存效果。对于小型随机数据集,插入排序可能会更快。但对于较大的集合,选择排序因其相对更好的缓存友好性而开始获胜。当然,一万条随机记录的数据量远远超出了在实践中应该使用插入或选择排序的范围。
【解决方案2】:

我不认为选择排序是最有效的排序算法 但它比冒泡排序更有效,但我怀疑插入排序

因为选择排序确实就地排序,它从列表的剩余部分中删除最小元素,然后将其插入到到目前为止排序的值的末尾。

插入排序仅根据需要扫描元素以对元素进行排序 但是选择排序必须扫描整个列表才能对任何元素进行排序。

选择排序参见这个例子

64 25 12 22 11

首先它在这个列表中找到最小的元素,它是 11

现在交换 11 和 64

11 25 12 22 64

next 求 25 12 22 64 中的最小值,即 12

所以现在列表是 11 12 25 22 64 这个过程继续

与插入排序一样

64 25 12 22 11

它首先检查 25 是否小于 64

25 64 12 22 11

12 64 25 22 11

12 25 64 22 11

12 22 64 25 11

12 22 25 64 11

11 22 25 64 12

11 12 25 64 22

11 12 22 64 25

11 12 22 25 64

冒泡、选择和插入的时间复杂度是O(n2)

选择排序适用于较小的列表,但我认为它们不适用于大型列表,对于较大的列表,合并/快速排序是最好的

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2021-12-29
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多