package com.yu.tree; import java.util.Arrays; /** * 堆排序 * @author Administrator * */ public class HeapSortDemo { public static void main(String[] args) { int[] arr = {4,6,8,5,9}; heapSort(arr); System.out.println(Arrays.toString(arr)); } /** * 堆排序 * 1、将待排序的数据构造成一个大顶堆,这个时候数组最大的值在堆顶的根节点 * 2、将根节点与末尾元素进行交换,此时末尾的数据是最大值 * 3、将剩下的n-1个元素重新构造成一个大顶堆,在自画像23步骤最后得到一个有序的数组 * * @param arr */ private static void heapSort(int[] arr) { int temp = 0; //arr.length/2 找到子节点的左值 //现将数组构造成一个大顶堆 for (int i = arr.length/2; i >= 0; i--) { adjust(arr,i,arr.length); } //开始循环交换并处理值,从后面开始处理 for (int i = arr.length-1; i > 0; i--) { temp = arr[i]; arr[i] = arr[0]; arr[0] = temp; adjust(arr,0,i); } } /*** *将数组构造成一个大顶堆, * 大顶堆,每个节点的值都大于或者等于其左右孩子的值 *小顶推 ,每个节点的值都小于或等于左右孩子的值 * @param arr 数组 * @param i 将要构造的下标 * @param length 数组的长度 */ private static void adjust(int[] arr, int i, int length) { int temp = arr[i];//保存要交换的值 for (int j = i*2+1; j < length; j=j*2+1) { //判断子节点左右孩子的值 if(arr[j] < arr[j+1] && j+1 < length) { //如果是右子树大则指向右子树 j++; } //如果父节点小于子节点则进行交换 if(temp < arr[j]) { arr[i] = arr[j]; i=j; }else { break; } } arr[i] = temp; } }