【问题标题】:Which sorting algorithm does qsort() use? [duplicate]qsort() 使用哪种排序算法? [复制]
【发布时间】:2013-08-28 09:38:09
【问题描述】:

stdlib.h 中的函数qsort() 是否顾名思义实际上使用了快速排序算法?

【问题讨论】:

  • 不一定。它是由实现定义的。

标签: c sorting optimization qsort


【解决方案1】:

qsort() 函数可以使用库实现者选择的任何排序算法来实现,但顾名思义,该算法应该接近最优。使用 O(N2) 算法是允许的,但这是一个主要的 QoI(实施质量)问题。

值得注意的是,与qsort()接口比较起来相当昂贵;任何增加比较次数以减少移动次数的排序算法(如果您不洗牌指针也可能很昂贵)可能会导致性能下降。但是,这是库实现者需要关注的问题。除非你发现这个库的实现很糟糕(现在这不太可能),否则不要担心。

C++ sort 算法可以围绕 C 的 qsort 运行环。

【讨论】:

  • +1 许多实现使用两个甚至三个混合的算法,具体取决于被排序的数据及其分析。我使用的 Apple LLVM 4.2 链实现有一个 amazing 实现,它实际上为小分区展开了冒泡排序(我认为它适用于小于 14 个元素的切片,但我必须检查才能确定)例如。
  • 很确定 qsort 曾经是常见的快速排序,当然这是平均情况 O(N log N) 但最坏情况 O(N^2)。这些天这会算作 QoI 问题吗?
  • @WhozCraig 你确定这是冒泡排序吗?这会让我感到惊讶,传统观点认为插入排序几乎总是更有效......
  • @Steve314 是的,它会 - 确定性快速排序适用于通过恶意(= 排序)输入进行的拒绝服务攻击(智能枢轴选择可以在一定程度上但不是完全缓解这种情况;只有随机变体在这方面真正有帮助)。这是 Web 服务的一个主要问题。更根本的是,在某些领域需要可预测的性能。
  • @WhozCraig 这听起来更像是sorting network,而不是冒泡排序。我自己将其用于并行任务调度程序,该调度程序必须非常有效地对极小的输入数组进行排序。
【解决方案2】:

C11 标准没有规定。所以任何合理的 O(n log n) 都是可以接受的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 2011-11-02
    • 1970-01-01
    相关资源
    最近更新 更多