STL std :: sort()使用Introsort,但是它如何工作?

时间:2018-11-14 23:39:54

标签: c++ sorting stl introsort

我不太了解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)

1 个答案:

答案 0 :(得分:2)

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

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


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


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

似乎正在发生的事情是,如果内省型超出了一定深度,则其余部分将切换到堆排序。


而且,仅需注意一点:使用Introsort不需要std::sort()(就像您的标题所暗示的那样),标准要求使用at most Nlog2N comparisons, where N=last-first之类的行为,否则不需要算法选择。