package sort;import java.util.Arrays;import java.util.stream.Collectors;public class HeapSort { /** * 选择排序-堆排序-不稳定排序 * @param array 待排序数组 * @return 已排序数组 */ public static int[] heapSort(int[] array){ //这里元素的索引是从0开始的,所以最后一个非叶子结点array.length/2 - 1 for(int i= array.length/2-1; i>=0; i--){ adjustHeap(array, i, array.length); // 调整堆 } // 上述逻辑,建堆结束 // 下面,开始排序逻辑 for(int j = array.length-1; j>0; j--){ // 元素交换,作用是去掉大顶堆 // 把大顶堆的根元素,放到数组的最后; // 换句话说,就是每一次的堆调整之后,都会有一个元素到达自己的最终位置 swap(array, 0, j); adjustHeap(array, 0, j); } return array; } /** * 整个堆排序最关键的地方 * @param array 待组堆 * @param i 起始结点 * @param length 堆的长度 */ public static void adjustHeap(int[] array, int i, int length){ // 先把当前元素取出来,因为当前元素可能要一直移动 int temp = array[i]; // 2*i+1 为i的左子树 // 2*k+1 为k的左子树 for(int k = 2 * i + 1; k < length; k = 2 * k + 1){ // 让 k 先指向子节点中最大的节点 if(k+1 < length && array[k] < array[k+1]){ // 如果有右子树,并且右子树大于左子树 k++; } // 如果发现节点(左右子节点)大于根节点,则进行值的交换 if(array[k] > temp){ swap(array, i, k); i = k; } else { break; } } } public static void swap(int[] arr, int a, int b){ int temp = arr[a]; arr[a] = arr[b]; arr[b] = temp; } public static void main(String[] args) { int []arr = {9,8,7,6,5,4,3,2,1}; arr = heapSort(arr); System.out.println(Arrays.stream(arr).boxed().collect(Collectors.toList())); }}