思路
- 构建最大堆
1.1 从最后的父节点开始调整堆
1.2 当i == 0时结束 - 调整堆的思路是:
2.1 比较当前的父节点 与 左右节点 谁大
2.2 父节点大说明没得调整了
2.3 左节点大就把父节点和左节点交换值,并递归调整,下一个父节点就从左节点那里开始
2.4 右节点同理 - 排序,从最后开始,与0交换,因为0是最大的位置,把最大放到最后,最后的位置就不用动了,heapSize - 1,然后调整堆,就得到排序好的数组。
代码
import java.util.Arrays;
public class HeapSort {
public static void heapSort(int[] arr){
if (arr.length <= 1){
return;
}
buildMaxHeap(arr);
for (int i = arr.length - 1; i >= 0; i--){
int tmep = arr[i];
arr[i] = arr[0];
arr[0] = tmep;
adjustHeap(arr, 0, i);
}
}
private static void buildMaxHeap(int[] arr){
int len = arr.length;
for (int i = (len / 2 )- 1; i >= 0; i--){
adjustHeap(arr, i, len);
}
}
private static void adjustHeap(int[] arr, int start, int end){
int left = start * 2 + 1;
int right = start * 2 + 2;
int maxIndex;
if (left < end && arr[left] > arr[start]) {
maxIndex = left;
} else {
maxIndex = start;
}
if (right < end && arr[right] > arr[maxIndex]){
maxIndex = right;
}
if (maxIndex != start){
int temp = arr[maxIndex];
arr[maxIndex] = arr[start];
arr[start] = temp;
adjustHeap(arr, maxIndex, end);
}
}
public static void main(String[] args) {
heapSort(new int[]{8,3,5,1,4});
}
}