学习堆排序,找了好久找不到问题在哪,如何解决?

这样写为啥无法实现堆排序?
运行结果是3 1 5 7

import java.util.Arrays;

public class HeapSort {
    public static void main(String[] args) {
        Solution s = new Solution();
        int[] arr={1,3,5,7};
        s.sort(arr);
        System.out.println(Arrays.toString(arr));
    }

}

public class Solution {
    /*length:数组的长度
    i:需要维护节点的下标*/
    private void heapify(int[] arr, int length, int i) {
        //最大值的下标为max
        int max = i;
        int lson = i * 2 + 1;
        int rson = i * 2 + 2;
        if (lson < length && arr[max] < arr[lson]) {
            max = lson;
        }
        if (rson < length && arr[max] < arr[rson]) {
            max = rson;
        }
        if (max != i) {
            swap(arr, i, max);
            //现在左或者右子节点,需要再次跟自己的子节点进行交换,此时他们的下标是max
            heapify(arr, length, max);
        }
    }

    public void swap(int[] arr, int a, int b) {
        int temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }

    public void buildMaxHeap(int[] arr) {
        for (int i = (arr.length - 2) / 2; i >= 0; i--) {
            //最后一个索引是arr.length-1,父亲节点是(arr.length-1-1)/2,也可以写作arr.length/2-1,把括号拆了。
            //我们是从最后一个节点的父节点开始循环得,所以i的初始值为(arr.length-1-1)/2
            heapify(arr, arr.length, (arr.length - 2) / 2);//!!
        }
    }

    public void sort(int[] arr) {
        buildMaxHeap(arr);
        for (int i = arr.length - 1; i >= 0; i--) {
            swap(arr, arr.length - 1, 0);
            heapify(arr, i, 0);
        }
    }
}

你在buildMmaxHeap函数里面调用heapify函数时传递的参数错了

【相关推荐】




如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^