
咱们能不能接着讨论这个话题:
比如堆排序可以找第 K 大数(得益于堆的 O(1) 查询和 O(lg N) 删除) 再比如归并排序可以用来找逆序对
1 forestyuan 2018 年 1 月 31 日 好处是算法简单,我就特别喜欢用选择排序 |
2 elgae 2018 年 1 月 31 日 有在工程中使用冒泡的吗? 没有 |
3 akira 2018 年 1 月 31 日 大部分人,在大部分情况下 都用不到。 |
4 zhuanzh 2018 年 1 月 31 日 via Android 可以用于教学。 |
5 Librazy 2018 年 1 月 31 日 当数列“基本有序”的时候,可以选用冒泡排序。这个“基本有序”要看实际数据的来做 profiling 确定临界点。 |
6 lhx2008 2018 年 1 月 31 日 via Android 插入排序在数据几乎有序的时候效率是比较高的,而且是稳定的,易于实现,在没有轮子的情况下手造一个插排也很简单。但是有轮子的话当然是用轮子,java 就是快排和归并,当然递归到数据量小的时候也可能用了插排。 另外,插排也可以简单进化成希尔排序,它的效率也非常高。 当然还有就是算法本身的价值了,思路是可复用的。 |
7 v2gba 2018 年 1 月 31 日 用来找工作呀~这很实际吧 |
8 lhx2008 2018 年 1 月 31 日 via Android 插排在数据(近乎)有序的时候是 o ( n )的复杂度,空间复杂度也是 o ( n ),还是有优势的 |
10 fox0001 2018 年 1 月 31 日 一般在数据库查询时排好序,写代码排序的情况很少,自己实现排序算法的情况更少 |
11 chengluyu 2018 年 1 月 31 日 via iPad 根据快速排序选取 pivot 的方式可以构造相应的数据把其时间复杂度变成 O(n^2),即使是随机选取 pivot 也有相应的攻击方式。因此比较成熟的语言库实现中都在数据量较小时使用插入排序,以增加算法时间复杂度上的稳定性。这是一个非常典型的应用。 另外插入排序在数据大致有序的情况下效果拔群…… 还有就是在一些嵌入式设备上,栈空间很小,数据量又小,非常适合用插入排序这种不需要空间的算法。 |
13 h4lbhg1G 2018 年 2 月 1 日 楼上正解 我没记错的话 C++的 STL 是 16 还是多少。教学上好像讲的是 9. |
14 3IOhG7M0knRu5UlC 2018 年 2 月 1 日 via Android 榨性能 |
15 msg7086 2018 年 2 月 1 日 |
16 aheadlead OP @lhx2008 “当然还有就是算法本身的价值了,思路是可复用的。” 愿闻其详 @chengluyu 就因为快排这问题,所以曾经有一段时间不知不觉练就了 90 秒盲打一个堆排的能力。 关于 introsort,这点我有所了解,所以会在帖子里面提到在问题规模不大的时候,平方排序有常数优势。 @msg7086 我非好高骛远。纯粹是从工程的角度,考虑这些算法还有什么工程意义。楼上提到插入排序对于数据大致有序的问题,效果拔群,这点我确实没有想到,感谢楼上各位。 此外还有一个线性排序也很有趣。 https://zh.wikipedia.org/wiki/计数排序 适合数据比较集中的情况。 |
17 gs139 2018 年 2 月 1 日 “梦然”的歌,在这个浮躁的时代,专心搞音乐不炒作的已经不多了。 |