import java.util.Arrays;
public class HeapSort {
public static void main(String[] args) {
int[] arr = { 10, 9, 3, 4, 5, 6, 7, 8, 9, 10 };
startSort(arr);
System.out.print(Arrays.toString(arr));
}
private final static int[] startSort(int[] arr) {
int length = arr.length;
int lastNonLeafNodeIndex = length / 2;
// 创建大顶堆
for (int i = lastNonLeafNodeIndex - 1; i >= 0; i--) {
letNodeMaxOfChilds(i, arr, length - 1);
}
// 交换&排序
for (int size = length - 1; size > 0;) {
int num = arr[size];
arr[size] = arr[0];
arr[0] = num;
//注意--size
letNodeMaxOfChilds(0, arr, --size);
}
return arr;
}
private final static void letNodeMaxOfChilds(int i, int[] arr, int size) {
int leftChildIndex = 2 * i + 1;
int rightChildIndex = 2 * i + 2;
if (leftChildIndex > size && rightChildIndex > size) {
return;
} else if (leftChildIndex > size) {
int rightNumber = arr[rightChildIndex];
if (rightNumber > arr[i]) {
swap(i, rightChildIndex, arr, size);
}
} else if (rightChildIndex > size) {
int leftNumber = arr[leftChildIndex];
if (leftNumber > arr[i]) {
swap(i, leftChildIndex, arr, size);
}
} else {
int rightNumber = arr[rightChildIndex];
int leftNumber = arr[leftChildIndex];
if (leftNumber > rightNumber) {
if (leftNumber > arr[i]) {
swap(i, leftChildIndex, arr, size);
}
} else {
if (rightNumber > arr[i]) {
swap(i, rightChildIndex, arr, size);
}
}
}
}
private static void swap(int top, int child, int[] arr, int size) {
int num = arr[top];
arr[top] = arr[child];
arr[child] = num;
letNodeMaxOfChilds(child, arr, size);
}
}
heapSort
最新推荐文章于 2022-08-20 23:22:09 发布