我不太了解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)
答案 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
之类的行为,否则不需要算法选择。