【问题标题】:What kind of input data are the following sorting algorithms good/bad for?以下排序算法对哪种输入数据好/坏?
【发布时间】:2019-05-02 21:47:40
【问题描述】:

以下排序算法对哪种数据输入有效/无效?快速排序、合并排序、堆排序、插入排序等

我知道至少有两个因素会影响排序算法的性能:1) 输入的大小,以及 2) 数据是否已经大部分排序。但我并不确切知道这些因素如何影响算法的效率。

我想详细研究一下,所以如果有任何资源/链接可以指点我,那就太好了。

【问题讨论】:

    标签: algorithm sorting


    【解决方案1】:

    假设快速排序基于 Hoare 分区方案(中间值作为枢轴),那么对于几乎排序的数据,它不会降低到 O(n^2) 的最坏情况时间复杂度。

    https://en.wikipedia.org/wiki/Quicksort#Hoare_partition_scheme

    合并排序总是执行 n ⌈log2(n)⌉ 移动。如果数据已经排序,则比较次数约为 (⌈n ⌈log2(n)⌉)/2。

    堆排序时间复杂度大致相同(重复可能会减少运行时间)。

    插入排序是该列表中唯一在数据接近排序时速度更快的排序,但它的时间复杂度为 O(n^2)。我在想,对于几乎排序的数据,时间复杂度将是 ~ O(m n),其中 m 是不合适的元素数。

    自然合并排序的变体,在扫描和识别已排序的运行时可能在小运行中使用插入排序,对已排序的数据将具有 O(n) 的时间复杂度。

    【讨论】:

    • 除排序外,它还取决于必须考虑的内存,例如,与其他排序相比,合并排序占用更多内存
    • @prashantrana - 是的,但这不是问题,除非输入的大小超过可用内存的 1/2,在这种情况下可以使用 block merge sort,但它比标准归并排序。块合并排序受数据影响,因为如果要排序的数组中至少有 2 · sqrt(n) 个唯一值,它会运行得最好,因为这些值用于创建工作区域,同时允许块合并排序保持稳定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 2011-11-14
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    • 2017-09-29
    相关资源
    最近更新 更多