选择排序、插入排序、冒泡排序等 O(n^2) 的排序有什么实际应用? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
aheadlead

选择排序、插入排序、冒泡排序等 O(n^2) 的排序有什么实际应用?

  •  
  •   aheadlead 2018 年 1 月 31 日 3742 次点击
    这是一个创建于 3005 天前的主题,其中的信息可能已经有所发展或是发生改变。
    除了在数据量较小时,O(n^2) 排序也许常数上要优于 O(n * log(n)) 的算法。

    还有啥时候可能会在工程里实际用到这些排序?

    谢谢
    第 1 条附言    2018 年 3 月 18 日

    咱们能不能接着讨论这个话题:

    比如堆排序可以找第 K 大数(得益于堆的 O(1) 查询和 O(lg N) 删除) 再比如归并排序可以用来找逆序对

    第 2 条附言    2018 年 3 月 18 日
    不一定要指平方级的排序算法

    这个新问题是这样:各种排序算法除了真正排序之外还有啥有趣的应用
    17 条回复    2018-02-01 01:27:21 +08:00
    forestyuan
        1
    forestyuan  
       2018 年 1 月 31 日   2
    好处是算法简单,我就特别喜欢用选择排序
    elgae
        2
    elgae  
       2018 年 1 月 31 日
    有在工程中使用冒泡的吗?
    没有
    akira
        3
    akira  
       2018 年 1 月 31 日
    大部分人,在大部分情况下 都用不到。
    zhuanzh
        4
    zhuanzh  
       2018 年 1 月 31 日 via Android
    可以用于教学。
    Librazy
        5
    Librazy  
       2018 年 1 月 31 日   1
    当数列“基本有序”的时候,可以选用冒泡排序。这个“基本有序”要看实际数据的来做 profiling 确定临界点。
    lhx2008
        6
    lhx2008  
       2018 年 1 月 31 日 via Android   1
    插入排序在数据几乎有序的时候效率是比较高的,而且是稳定的,易于实现,在没有轮子的情况下手造一个插排也很简单。但是有轮子的话当然是用轮子,java 就是快排和归并,当然递归到数据量小的时候也可能用了插排。
    另外,插排也可以简单进化成希尔排序,它的效率也非常高。
    当然还有就是算法本身的价值了,思路是可复用的。
    v2gba
        7
    v2gba  
       2018 年 1 月 31 日
    用来找工作呀~这很实际吧
    lhx2008
        8
    lhx2008  
       2018 年 1 月 31 日 via Android   1
    插排在数据(近乎)有序的时候是 o ( n )的复杂度,空间复杂度也是 o ( n ),还是有优势的
    lhx2008
        9
    lhx2008  
       2018 年 1 月 31 日 via Android   1
    @lhx2008 辅助的空间复杂度应该是 o1
    fox0001
        10
    fox0001  
       2018 年 1 月 31 日
    一般在数据库查询时排好序,写代码排序的情况很少,自己实现排序算法的情况更少
    chengluyu
        11
    chengluyu  
       2018 年 1 月 31 日 via iPad   3
    根据快速排序选取 pivot 的方式可以构造相应的数据把其时间复杂度变成 O(n^2),即使是随机选取 pivot 也有相应的攻击方式。因此比较成熟的语言库实现中都在数据量较小时使用插入排序,以增加算法时间复杂度上的稳定性。这是一个非常典型的应用。

    另外插入排序在数据大致有序的情况下效果拔群……

    还有就是在一些嵌入式设备上,栈空间很小,数据量又小,非常适合用插入排序这种不需要空间的算法。
    chengluyu
        12
    chengluyu  
       2018 年 1 月 31 日 via iPad   1
    @chengluyu 对了,这种快速排序混着别的排序的算法叫做 introsort。
    h4lbhg1G
        13
    h4lbhg1G  
       2018 年 2 月 1 日   1
    楼上正解 我没记错的话 C++的 STL 是 16 还是多少。教学上好像讲的是 9.
    3IOhG7M0knRu5UlC
        14
    3IOhG7M0knRu5UlC  
       2018 年 2 月 1 日 via Android
    榨性能
    msg7086
        15
    msg7086  
       2018 年 2 月 1 日   2
    @chengluyu 有中文翻译成内省排序的。

    @aheadlead 算法都是从简单到难的,不可能刚开始直接教你跳舞树什么的吧。以前科技不发达的时候,人们只知道这些简单的排序算法,后来一点点发现性能越来越好的,于是老办法就都淘汰了,只用来教学使用。

    比如说高中时候证明函数单调性,用两个函数相减然后判断变量范围的方法来做。
    到了后来学了微积分,同样的题目一阶导数下去一把梭就得了,就犯不着再用原来的办法了。

    O(n^2)排序也逐渐成为了教科书算法,常常作为反例,告诉你哪些算法太 nave,自己写代码的时候要小心了。
    aheadlead
        16
    aheadlead  
    OP
       2018 年 2 月 1 日
    @lhx2008 “当然还有就是算法本身的价值了,思路是可复用的。”
    愿闻其详


    @chengluyu 就因为快排这问题,所以曾经有一段时间不知不觉练就了 90 秒盲打一个堆排的能力。
    关于 introsort,这点我有所了解,所以会在帖子里面提到在问题规模不大的时候,平方排序有常数优势。


    @msg7086 我非好高骛远。纯粹是从工程的角度,考虑这些算法还有什么工程意义。楼上提到插入排序对于数据大致有序的问题,效果拔群,这点我确实没有想到,感谢楼上各位。


    此外还有一个线性排序也很有趣。
    https://zh.wikipedia.org/wiki/计数排序
    适合数据比较集中的情况。
    gs139
        17
    gs139  
       2018 年 2 月 1 日
    “梦然”的歌,在这个浮躁的时代,专心搞音乐不炒作的已经不多了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1540 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 66ms UTC 16:49 PVG 00:49 LAX 09:49 JFK 12:49
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86