public class HeapSort {
/**
* 上浮调整小顶堆
*
* @param arr
*/
public void upAdjust(int[] arr) {
//获取做后一个叶子结点A的位置
int targetSon = arr.length - 1;
//获取该叶子结点A的父结点B
int parent = (targetSon - 1) / 2;
//临时记录最后一个叶子结点A的内容
int temp = arr[targetSon];
//结点A并不是根结点并且temp比结点B小
while (targetSon > 0 && temp < arr[parent]) {
//把父结点B的内容赋值给A
arr[targetSon] = arr[parent];
//同时将结点A指向的位置变为结点B的位置
targetSon = parent;
//将结点B的位置指向结点A的父结点
parent = (targetSon - 1) / 2;
}
//最后将该temp的值赋予A的位置
arr[targetSon] = temp;
}
/**
* 下沉调整小顶堆
*
* @param arr 待调整的
* @param parent
* @param end
*/
public void downAdjust(int[] arr, int parent, int end) {
int temp = arr[parent];
int son = parent * 2 + 1;
while (son < end) {
if (son + 1 < end && arr[son + 1] < arr[son]) {
son++;
}
if (arr[son] >= temp) {
break;
}
arr[parent] = arr[son];
parent = son;
son = parent * 2 + 1;
}
arr[parent] = temp;
}
/**
* 构建小顶堆
*
* @param arr
*/
public void build(int[] arr) {
int lastNonLeafNodeIndex = (arr.length - 2) / 2;
for (int i = lastNonLeafNodeIndex;i>=0;i--){
downAdjust(arr,i,arr.length);
}
}
public static void main(String[] args) {
HeapSort heapSort = new HeapSort();
int[] arr = {8,1,2,4,9,7,8,4,6,5};
heapSort.build(arr);
System.out.println(arr);
}
}