HeapSort堆排序(罗召勇版)

 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 }

 

posted @ 2021-03-01 21:04  TRAODM  阅读(55)  评论(0)    收藏  举报