然而,在算法的中间,我们对一个大小的子数组进行递归调用n/5
以找到中位数的中位数。当这个递归调用返回时,我们使用返回的中位数作为基准来划分数组。
这个算法不是将O(lg n)
激活记录作为递归的一部分推送到运行时堆栈吗?从我所见,这些寻找中位数的连续中位数的递归调用不能进行尾调用优化,因为我们在递归调用返回后做了额外的工作。因此,该算法似乎需要辅助空间(就像快速排序一样,由于运行时堆栈使用的空间O(lg n)
,维基百科将其列为需要辅助空间)。O(lg n)
我错过了什么,还是维基百科的文章错了?
(注意:我所指的递归调用return select(list, left, left + ceil((right - left) / 5) - 1, left + (right - left)/10)
在维基百科页面上。)