1 package demo030102;
2
3 import java.util.Arrays;
4
5 public class HeapSort {
6 public static void main(String[] args) {
7 int[] arr = new int[]{22, 5, 10, 11, 6, 23, 54, 3, 8};
8 heapSort(arr);
9
10 System.out.println(Arrays.toString(arr));
11 }
12
13 public static void heapSort(int[] arr) {
14 //开始位置为最后一个节点的父节点
15 //第一次循环操作,调整数组的二叉树结构为大顶堆
16 for (int start = (arr.length - 1) / 2; start >= 0; start--) {
17 maxHeap(arr, arr.length, start);
18 }
19 //把数组中第一个元素和最后一个交换,递归调用生成新的大顶堆
20 for (int i = arr.length - 1; i > 0; i--) {
21 int temp = arr[0];
22 arr[0] = arr[i];
23 arr[i] = temp;
24 //递归,在大顶堆框架的基础上,只处理root节点即可!!!
25 maxHeap(arr, i, 0);
26 }
27 }
28
29 /**
30 * @param arr 传入一个数组
31 * @param heapSize 待排序数组大小
32 * @param index 待排序节点根节点位置,最后一个非叶子节点,最后一个节点的父节点
33 */
34 //堆排序,每次从数组中取出最大值放在数组最后的位置
35 public static void maxHeap(int[] arr, int heapSize, int index) {
36 //左子节点
37 int leftNode = 2 * index + 1;
38 //右子节点
39 int rightNode = 2 * index + 2;
40 //root和左右节点分别对比,找出最大节点data,设置浮标temp
41 int max = index;
42 if (leftNode < heapSize && arr[max] < arr[leftNode]) {
43 max = leftNode;
44 }
45 if (rightNode < heapSize && arr[max] < arr[rightNode]) {
46 max = rightNode;
47 }
48 if (max != index) {
49 int val = arr[max];
50 arr[max] = arr[index];
51 arr[index] = val;
52 //交换位置后,可能会破坏底层排好的堆,需要递归调用自身修正
53 maxHeap(arr, heapSize, max);
54 }
55 }
56 }