commit
2897e13fab
74
java/28_sorts/HeapSort.java
Normal file
74
java/28_sorts/HeapSort.java
Normal file
@ -0,0 +1,74 @@
|
||||
/**
|
||||
* 堆排序
|
||||
*/
|
||||
public class HeapSort {
|
||||
|
||||
/**
|
||||
* 排序
|
||||
* <p>
|
||||
* 堆元素是从数组下标0开始
|
||||
*
|
||||
* @param arr
|
||||
*/
|
||||
public static void sort(int[] arr) {
|
||||
if (arr.length <= 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 1、建堆
|
||||
buildHeap(arr);
|
||||
|
||||
// 2、排序
|
||||
int k = arr.length - 1;
|
||||
while (k > 0) {
|
||||
// 将堆顶元素(最大)与最后一个元素交换位置
|
||||
swap(arr, 0, k);
|
||||
// 将剩下元素重新堆化,堆顶元素变成最大元素
|
||||
heapify(arr, --k, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 建堆
|
||||
*
|
||||
* @param arr
|
||||
*/
|
||||
private static void buildHeap(int[] arr) {
|
||||
// (arr.length - 1) / 2 为最后一个叶子节点的父节点
|
||||
// 也就是最后一个非叶子节点,依次堆化直到根节点
|
||||
for (int i = (arr.length - 1) / 2; i >= 0; i--) {
|
||||
heapify(arr, arr.length - 1, i);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 堆化
|
||||
*
|
||||
* @param arr 要堆化的数组
|
||||
* @param n 最后堆元素下标
|
||||
* @param i 要堆化的元素下标
|
||||
*/
|
||||
private static void heapify(int[] arr, int n, int i) {
|
||||
while (true) {
|
||||
// 最大值位置
|
||||
int maxPos = i;
|
||||
// 与左子节点(i * 2 + 1)比较,获取最大值位置
|
||||
if (i * 2 + 1 <= n && arr[i] < arr[i * 2 + 1]) {
|
||||
maxPos = i * 2 + 1;
|
||||
}
|
||||
// 最大值与右子节点(i * 2 + 2)比较,获取最大值位置
|
||||
if (i * 2 + 2 <= n && arr[maxPos] < arr[i * 2 + 2]) {
|
||||
maxPos = i * 2 + 2;
|
||||
}
|
||||
// 最大值是当前位置结束循环
|
||||
if (maxPos == i) {
|
||||
break;
|
||||
}
|
||||
// 与子节点交换位置
|
||||
swap(arr, i, maxPos);
|
||||
// 以交换后子节点位置接着往下查找
|
||||
i = maxPos;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user