【问题标题】:STL std::sort() uses Introsort, but how does it work?STL std::sort() 使用 Introsort,但它是如何工作的?
【发布时间】:2018-11-14 23:39:53
【问题描述】:

我并没有真正了解 Introsort 算法。如您所见,我添加了它的伪代码。 最大深度是什么意思?

⌊log(length(A))⌋ × 2”是什么意思

我希望有人能给我解释一下。

 procedure sort(A : array):
        let maxdepth = ⌊log(length(A))⌋ × 2
        introsort(A, maxdepth)

procedure introsort(A, maxdepth):
    n ← length(A)
    p ← partition(A)  // assume this function does pivot selection, p is the final position of the pivot
    if n ≤ 1:
        return  // base case
    else if maxdepth = 0:
        heapsort(A)
    else:
        introsort(A[0:p], maxdepth - 1)
        introsort(A[p+1:n], maxdepth - 1)

【问题讨论】:

  • Introsort 如果耗时过长,就会退出快速排序并切换到堆排序。注意maxdepthelse if maxdepth = 0: heapsort(A) 的用法。如果太深,用堆排序结束。

标签: c++ sorting stl introsort


【解决方案1】:

关于⌊log(length(A))⌋ × 2 的问题,⌊...⌋ 位仅表示floor,小于或等于该值的最大整数。

在一种不太数学的语言中,应该是int(log(length(A))) * 2


如果有人提出floor(向-∞ 舍入)和int(向0 舍入)之间的差异,这里无关紧要,因为长度必须是非负整数。如果长度为零,您仍然会遇到数学问题,但这是一个例外情况,因为它可能不需要排序:-)


至于为什么 maxdepth 存在,这显然是一种基于树的算法——log 的使用也支持这一点,因为平衡树的深度往往与对数成正比其中的节点数。

似乎正在发生的事情是,如果 introsort 超出了某个深度,它就会切换到 heapsort 来处理剩余部分。


而且,只有一个小注意事项:std::sort() 不需要 使用 Introsort(正如您的标题似乎暗示的那样),标准要求行为,例如 at most Nlog<sub>2</sub>N comparisons, where N=last-first,但除此之外没有要求算法选择。

【讨论】:

    猜你喜欢
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多