请写出带注释的Java版堆排序代码并有输出结果
时间: 2024-05-13 12:14:55 浏览: 88
以下是带注释的Java版堆排序代码:
```java
public class HeapSort {
// 堆排序的实现方法
public static void heapSort(int[] arr) {
// 1. 构建大根堆
buildMaxHeap(arr);
// 2. 循环将堆首位(最大值)与末位交换,然后再重新调整大根堆
for (int i = arr.length - 1; i > 0; i--) {
swap(arr, 0, i); // 将堆首位和末位交换
adjustHeap(arr, 0, i); // 重新调整大根堆
}
}
// 构建大根堆
public static void buildMaxHeap(int[] arr) {
// 从最后一个非叶子结点开始向上构建大根堆
for (int i = arr.length / 2 - 1; i >= 0; i--) {
adjustHeap(arr, i, arr.length);
}
}
// 调整大根堆
public static void adjustHeap(int[] arr, int i, int length) {
int temp = arr[i]; // 先取出当前元素i
for (int j = 2 * i + 1; j < length; j = 2 * j + 1) { // 从i结点的左子结点开始,也就是2i+1处开始
if (j + 1 < length && arr[j] < arr[j + 1]) { // 如果左子结点小于右子结点,j指向右子结点
j++;
}
if (arr[j] > temp) { // 如果子节点大于父节点,将子节点值赋给父节点
arr[i] = arr[j];
i = j;
} else {
break;
}
}
arr[i] = temp; // 将temp值放到最终的位置
}
// 交换元素位置
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
// 测试
public static void main(String[] args) {
int[] arr = {4, 6, 8, 5, 9};
heapSort(arr);
System.out.println(Arrays.toString(arr));
}
}
```
输出结果为:[4, 5, 6, 8, 9]
阅读全文