import java.util.Arrays;
public class HeapSort {
public static void main(String[] args) {
int[] arr = new int[]{5,4,1,9,8,6,3,7,2,0,1};
System.out.println("排序前:");
System.out.println(Arrays.toString(arr));
heapSort(arr);
System.out.println("排序後:");
System.out.println(Arrays.toString(arr));
}
//堆排序
public static void heapSort(int[] arr){
//開始調整的位置爲最後一個葉子節點
int start = (arr.length - 1)/2;
//從最後一個葉子節點開始遍歷,調整二叉樹
for (int i = start; i >= 0 ; i--){
maxHeap(arr, arr.length, i);
}
for (int i = arr.length - 1; i > 0; i--){
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
maxHeap(arr, i, 0);
}
}
//將二叉樹調整爲大頂堆
public static void maxHeap(int[] arr, int size, int index){
//建立左子節點
int leftNode = 2 * index + 1;
//建立右子節點
int rightNode = 2 * index + 2;
int maxNode = index;
//左子節點的值大於根節點時調整
if (leftNode < size && arr[leftNode] > arr[maxNode]){
maxNode = leftNode;
}
//右子節點的值大於根節點時調整
if (rightNode < size && arr[rightNode] > arr[maxNode]){
maxNode = rightNode;
}
if (maxNode != index){
int temp = arr[maxNode];
arr[maxNode] = arr[index];
arr[index] = temp;
//交換之後可能會破壞原來的結構,需要再次調整
//遞歸調用進行調整
maxHeap(arr, size, maxNode);
}
}
}