最近,我正在研究C#中基本排序算法的时序分析 Following this Book。 在第55页上,作者总结提到了这一点。
选择排序是最有效的算法,其次是 通过冒号排序和插入排序
但实际上选择排序比插入和冒泡排序花费更多时间,最佳,正常和最坏的情况。 即使this online algorithm visualisation显示选择排序需要更多时间。
我的问题是,与插入和冒泡排序相比,选择排序的效率如何?
答案 0 :(得分:3)
我认为你过分夸大了作者的主张。
在谈到相对效率时,本书的作者在非常具体的情况下对算法进行了比较:
通过测量在这些特定情况下的时间,作者得出结论,当在他的特定硬件上对10,000个随机播种的元素进行排序时,他在三种实现中的选择排序的实现是最快的。这是他可以合理地做出的唯一主张。特别是,对于作者的实验来说,选择排序在某种程度上是三者中效率最高的主张太过笼统。
作者的实验导致他所展示的排名的原因很可能是算法的缓存友好性。
选择排序在大多数时间以单一方向读取,并且其大多数操作都是读取。另一方面,插入排序做了大量的写作。冒泡排序在大多数情况下也会朝着相同的方向发展,但它会将写入与读取混合在一起,并且写入比选择排序更多。简而言之,作者对选择排序的实现似乎是作者硬件的三种算法中最优化的
答案 1 :(得分:0)
我不认为选择排序是一种非常有效的排序算法 但它比冒泡排序更有效但我怀疑插入排序
因为选择排序会进行就地排序,它会从列表的其余部分中删除最小元素,然后将其插入到目前为止排序的值的末尾。
插入排序仅作为排序元素所需的元素进行扫描 但是选择排序必须扫描整个列表以对任何元素进行排序。
请参阅此示例以了解选择排序
64 25 12 22 11
首先,它在此列表中找到最小元素,它是11
现在交换11和64
11 25 12 22 64
接下来在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)
选择排序适用于较小的列表,但我认为它们对于大型列表失败,对于较大的列表,合并/快速排序是最好的
希望这有帮助