堆排序原理:
本文中使用的堆为最大堆,堆顶元素为索引为0的元素。
1、将一个无序的数组构建成一个最大堆
2、交换0号元素和最后一个元素,则最后一个元素(索引假设为 lastIndex )为最大的元素
3、将[0 ~ lastIndex - 1]的元素构建最大堆,则0号元素为最大元素
4、交换 0 和 lastIndex - 1的元素,则 lastInde - 1, lastIndex元素有序。
5、继续上面步骤,直到数组当中只剩下最后一个元素。
import java.util.Arrays;
public class HeapSort {
public static void main(String[] args) {
HeapSort heapSort = new HeapSort();
int[] arr = new int[]{1, 2, 3, 4, 5, 3};
heapSort.heapSort(arr);
System.out.println(Arrays.toString(arr));
}
private static void heapSort(int[] arr) {
//构建一个最大堆
int ln = arr.length - 1;
for (int i = ln >>> 1; i >= 0; i--) {
siftDown(arr, i, ln);
}
for (int i = ln; i > 0; i--) {
//交换0和最后一个元素
arr[0] = arr[0] ^ arr[i] ^ (arr[i] = arr[0]);
//构建一个最大堆
siftDown(arr, 0, i - 1);
}
}
private static void siftDown(int[] arr, int idx, int ln) {
int l = (idx << 1) + 1, r = (idx << 1) + 2, m = l;
if (l > ln) return;
if (r <= ln && arr[l] < arr[r]) m = r;
if (arr[m] > arr[idx]) {
arr[m] = arr[m] ^ arr[idx] ^ (arr[idx] = arr[m]);
siftDown(arr, m, ln);
}
}
}