我正在处理涉及java中的堆排序实现的家庭作业问题。这是我到目前为止所拥有的
public class HeapSort {
public static void maxHeapify(int[] a, int i) {
int largest;
int l = 2*i;
int r = (2*i)+1;
if (l<=a.length-1 && a[l]>a[i]) {
largest = l;
}
else {
largest = i;
}
if (r<a.length-1 && a[r]>a[largest]) {
largest = r;
}
if (largest != i) {
int temp = a[i];
a[i] = a[largest];
a[largest] = temp;
maxHeapify(a,largest);
}
}
public static void buildMaxHeap(int[] a) {
for (int i=(a.length-1/2); i>=1; i--) {
maxHeapify(a,i);
}
}
public static void heapSort(int[] a) {
buildMaxHeap(a);
for (int i=a.length-1; i>=1; i--) {
int temp = a[0];
a[0] = a[i];
a[0] = temp;
maxHeapify(a,1);
}
}
这是我放在一起测试(带输出)
的主要内容public static void main(String[] args) {
int[] tester = {3,2,9,45,7,15,21,11,36};
System.out.println(Arrays.toString(tester));
heapSort(tester);
System.out.println(Arrays.toString(tester));
}
[3, 2, 9, 45, 7, 15, 21, 11, 36]
[3, 45, 36, 21, 9, 15, 2, 11, 7]
我目前没有收到任何错误,但输出有点偏。很感谢任何形式的帮助。谢谢!
*编辑添加样本输出
答案 0 :(得分:2)
快速浏览一下,我会说你错过了一些对maxHeapify()的调用。看起来你只有maxHeapify()堆的一半(在最右边的分支中结束的一半),而不是其余的。必须将[0]中所有元素的maxHeapify()调用为[length / 2]。
您应该将递归调用maxHeapify()移出条件以进行交换。对于堆的初始构建,您必须一直传播到根。
并且你没有maxHeapify()'最大'元素,但是一个级别在堆上,所以总是i/2
。
答案 1 :(得分:0)
if (r<a.length-1 && a[r]>a[largest]) {
largest = r;
}
应该是
if (r<=a.length-1 && a[r]>a[largest]) {
largest = r;
}
我相信您还必须在最后一个循环中调用maxHeapify(a,0);
而不是maxHeapify(a,1);
。除了上面提到的评论中的-1/2排序问题。那应该可以胜任。