这样写为啥无法实现堆排序?
运行结果是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函数时传递的参数错了
【相关推荐】
选取一个基准值,小数在左大数在在右。