【发布时间】:2012-06-21 03:40:30
【问题描述】:
我对算法有点陌生,想实现堆排序算法。 算法如下:
父母(i) 返回 Math.floor(i/2)
左(i) 返回 2i
右(i) 返回 2i+1
然后是恢复 heep 属性的 HEAPIFY 方法。算法如下:
HEAPIFY(A, i)
l = Left(i)
r = Right(i)
if (l <= heap-size[A] and A[l] > A[i]
then largest = l
else largest = i
if r <= heap-size[A] and A[r] > A[largest]
then largest = r
if largest != i
then exchange A[i] <-> A[largest]
HEAPIFY(A, largest)
我实现这个方法的代码是:
public static void HEAPIFY(int[] A, int i) {
int l = LEFT(i);
int r = RIGHT(i);
int largest = 0;
if (l < A.length && A[l] > A[i]) {
largest = l;
} else {
largest = i;
}
if (r < A.length && A[r] > A[largest]) {
largest = r;
}
if (largest != i) {
int temp = A[i];
A[i] = A[largest];
A[largest] = temp;
HEAPIFY(A, largest);
}
}
现在我的问题是在书中算法通过绘制堆和数组树来显示 例如数组是:[16,14,10,8,7,9,3,2,4,1] 对于树和数组,它的索引从 1 到 n,所以 Array[1] = 16和编码Array [0] = 16。现在我无法调整heapify方法以从索引1开始并上升到1,或者以某种方式使其从0开始并让堆从0索引到n-1。
对不起,如果它有点令人困惑,我仍然感到困惑,但我真的很感激一些帮助。
谢谢大家
现在 HEAPIFY 可以工作了,下面的代码是构建堆的代码:
public static void BUILD_HEAP(int[] A) {
heapSize = A.length;
for (int i = (int) Math.floor(A.length / 2.0); i >= 0; i--) {
HEAPIFY(A, i);
}
}
构建堆也可以,唯一不起作用的方法是堆排序。
public static void HEAPSORT(int[] A) {
BUILD_HEAP(A);
for (int i = A.length-1; i >= 1; i--) {
int temp = A[0];
A[0] = A[i];
A[i] = temp;
heapSize = heapSize-1;
HEAPIFY(A,0);
}
}
这必须排序,但是当我在调用 heapsort 后尝试遍历数组时,它不会给出排序后的数组。 任何想法如何修复堆排序?
【问题讨论】:
标签: java algorithm heap heapsort