在我阅读“算法简介”时,我想知道为什么HEAPSORT
需要时间O(nlgn),而BUILD-MAX-HEAP
需要时间O(n)。
HEAPSORT
在A.length downto 2开始for循环,调用MAX-HEAPIFY
。
BUILD-MAX-HEAP
在A.length / 2 downto 1的楼层开始其for循环,调用MAX-HEAPIFY
。
MAX-HEAPIFY
需要时间O(lgn)。我想知道是什么导致BUILD-MAX-HEAP
比HEAPSORT
更快。
答案 0 :(得分:1)
在构建堆时,我们始终从底部开始“解密”元素,但在对其进行排序时,我们总是“HEAPIFY”最顶层的元素。在这两种情况下,高度都是变化的,但要指出:
* 在构建堆时,我们堆积的最大元素位于底部,并且它们的堆积高度非常小,因此O(n),但在排序时,我们始终堆积最顶层的元素。即使高度在下降,它也不像在先前的情况那样有利。 * 强>
我希望你能理解我想说的话。
答案 1 :(得分:1)
在heapsort算法中,你总是担心“堆条件”,它指出不应该在堆中放置更大元素的元素,如果有这样的元素违反堆条件,那么你修复它。修复堆条件需要多少努力取决于需要修复的元素底部以上的高度。
在构建堆的初始阶段,后半部分元素不会违反堆条件,因为下面没有任何内容。四分之一的元素违反了堆条件,但只是堆底部的一行,因此只需要一个步骤来修复堆条件。然后八分之一的元素违反堆条件,但只是堆底部的两行,所以只需要两个步骤。
如果你加上所需的步数,你会得到n / 4 * 1 + n / 8 * 2 + n / 16 * 3 + n / 32 * 4 ...加起来小于n。但是当你通过在数组的末尾反复放入数字最大的第一个元素进行排序时,堆的条件是始终违反堆顶部,(log n)行在底部之上,因此需要log n步骤来修复堆条件。