我对Max Heap Sort的这个伪代码的一部分感到困惑。 低至2 意味着什么?
HeapSort(A)
Build-Max-Heap(A)
for i <-- length[A] down to 2
do exchange A[1] <---> A[i]
heap-size[A] = heap-size[A] -1
Max-Heapify(A,1)
答案 0 :(得分:0)
这意味着您为{length[A], length[A] - 1, length[A] - 2, ..., 2}
中的每个i值重复该块。
如果这是C(或C ++,或Java-所有相同的语法),可以写一下:
for (int i = length(A), i >= 2, i--) {
do...
}
答案 1 :(得分:0)
Heapsort本质上是选择排序,但是数组的未排序部分以maxheap数据结构的形式存储。更具体地说,heapsort的工作原理如下。首先选择数组A [1..n]中的最大元素,并将其与A [n]交换。然后选择数组A [1..n-1]中的最大元素并将其与A [n-1]交换。重复此过程,直到在最后一次迭代中,我们找到A [1..2]中的最大元素并将其与A [2]交换。此时,元素A [2..n]处于正确的位置,因此A [1]也处于正确的位置,数组也被排序。
这几乎就像选择排序(我们将选择A [1..i]中的最大元素并将其与A [i]交换),除了在heapsort中使用A [1..i]存储数据结构称为maxheap,因此选择最大元素的过程不是使用线性搜索(如选择排序),而是通过最大化数组,从而将最大元素带到第一个位置A [1]。因此,找到最大元素需要log n时间而不是线性时间。
上述算法可以表达为:对于i = n,n-1,...,2(按此顺序),找到A [1..i]中的最大元素并将其与A [i交换] ]。由于我以递减顺序获取值,因此for循环可以写为:for i = n downto 2.