Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 堆排序问题_Java_Algorithm_Sorting_Heapsort - Fatal编程技术网

Java 堆排序问题

Java 堆排序问题,java,algorithm,sorting,heapsort,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]) {

我正在研究一个家庭作业问题,涉及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);
        }
    }
我目前没有收到任何错误,但输出只是有点差。非常感谢您的帮助。谢谢


*编辑以添加示例输出

快速浏览一下,我想说您错过了对maxHeapify()的许多调用。看起来您只需要maxHeapify()堆的一半(在最右边分支中结束的那一半),而不是其余部分。必须将[0]中的所有元素的maxHeapify()调用为[length/2]

您应该将对maxHeapify()的递归调用移出交换条件。对于堆的初始构建,必须一直传播到根。 而且您不需要maxHeapify()最大的元素,而是堆上一层的元素,因此总是
i/2

if(ra[maxist]){
    if (r<a.length-1 && a[r]>a[largest]) {
        largest = r;
    }
最大=r; }
应该是

    if (r<=a.length-1 && a[r]>a[largest]) {
        largest = r;
    }
if(ra[最大]){
最大=r;
}

我相信您还必须调用
maxHeapify(a,0)而不是
maxHeapify(a,1)在最后一个循环中。除此之外,上述评论中的-1/2订购问题。这应该就可以了。

(a.length-1/2)
非常确定它的
a.length/2
BuildMaxHeap()
中,也许你是想写
(a.length-1)/2
。注意操作顺序…
a.length-1/2==a.length
。进行了此更改,并尝试使用相同的输出将其更改为a.length/2。一定还有别的事。谢谢你的建议!
    if (r<=a.length-1 && a[r]>a[largest]) {
        largest = r;
    }