BUILD-MAX-HEAP数组的运行时间按递减顺序排序

时间:2016-09-25 21:16:12

标签: algorithm sorting heapsort max-heap

我知道堆排序中BUILD-MAX-HEAP的运行时间是O(n)。但是,如果我们有一个已经按递减顺序排序的数组,为什么我们仍然有O(n)的BUILD-MAX-HEAP运行时间?
它不应该像O(1)那样吗?它已经从最大值到最小值排序,因此我们不需要MAX-HEAPIFY。

我的理解是否正确?有人可以向我解释一下吗?

2 个答案:

答案 0 :(得分:1)

你是对的。它当然可以是O(1)。如果您确定列表已经排序,则可以将其用作最大堆。

使用数组的堆的常见实现将此行为用于其元素位置:

childs[i] = 2i+1 and 2i+2
parent[i] = floor((i-1)/2)

此规则适用于已排序的数组。 (降为最大堆,增加最小堆)。

注意如果您需要先检查列表是否已排序,那么它当然仍然是O(n)

编辑:堆排序复杂性
即使数组可能已排序并且构建堆实际上可能需要O(1)。每当您执行堆排序时,您仍然会以O(n log n)结束 正如评论中所述,Heap Sort正在对n执行extract-max次来电。每个提取操作都需要O(log n) - 我们的总时间复杂度为O(n log n) 如果数组未排序,我们将得到O(n + nlogn)的总时间复杂度,仍为O(n log n)

答案 1 :(得分:0)

如果知道数组已按降序排序,则无需对其进行排序。如果您想按升序排列,可以在O(n)时间内反转数组。

如果您不知道数组是否已经排序,则需要O(n)来确定它是否已经反向排序。

从反向排序数组构建最大堆的原因被认为是O(n),你必须从项目n / 2开始,并且向后工作,确保元素不小于其子元素。即使只有n / 2次检查,它也被认为是O(n),因为执行的操作次数与要检查的项目总数成正比。

顺便说一句,值得注意的是,你可以更快地从反向排序的数组构建一个最大堆,而不是检查数组以查看它是否反向排序。