堆排序问题

时间:2013-02-22 07:09:16

标签: java algorithm sorting heapsort

我正在处理涉及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]

我目前没有收到任何错误,但输出有点偏。很感谢任何形式的帮助。谢谢!

*编辑添加样本输出

2 个答案:

答案 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排序问题。那应该可以胜任。