堆排序是一種高效的排序算法,它利用了堆的數據結構來實現。堆是一種特殊的完全二叉樹,分為最大堆和最小堆兩種類型。在最大堆中,父節點的值大于等于其子節點的值;而在最小堆中,父節點的值小于等于其子節點的值。
堆排序的基本思想是:
- 將待排序的序列構造成一個大頂堆(或小頂堆)。
- 此時,整個序列的最大值(或最小值)就是堆頂的根節點。
- 將堆頂元素與末尾元素進行交換,使末尾元素最大(或最小)。
- 然后對剩余的 n-1 個元素重新構造堆,得到 n-1 個元素的最大(或最小)值。
- 如此反復執行,直到整個序列有序。
代碼實現:
public class HeapSort {public void heapSort(int[] arr) {int n = arr.length;for (int i = n / 2 - 1; i >= 0; i--){heapify(arr, n, i);}for (int i = n - 1; i > 0; i--) {int temp = arr[0];arr[0] = arr[i];arr[i] = temp;heapify(arr, i, 0);}}void heapify(int[] arr, int n, int i) {int largest = i; int l = 2 * i + 1; // left = 2*i + 1int r = 2 * i + 2; // right = 2*i + 2if (l < n && arr[l] > arr[largest])largest = l;if (r < n && arr[r] > arr[largest])largest = r;if (largest != i) {int swap = arr[i];arr[i] = arr[largest];arr[largest] = swap;heapify(arr, n, largest);}}public void printArray(int[] arr) {int n = arr.length;for (int i = 0; i < n; ++i)System.out.print(arr[i] + " ");}public static void main(String[] args) {int[] arr = {12, 11, 13, 5, 6, 7};int n = arr.length;HeapSort heapSort = new HeapSort();heapSort.heapSort(arr);heapSort.printArray(arr);}
}