堆排序是原地、O(n log n) 最壞情況保證的比較排序算法,利用二叉堆數據結構實現,是系統級排序的常見選擇。
heapifyvoid heapify(int arr[], int n, int i) {
int largest = i;
int left = 2*i + 1;
int right = 2*i + 2;
if (left < n && arr[left] > arr[largest]) largest = left;
if (right < n && arr[right] > arr[largest]) largest = right;
if (largest != i) {
swap(&arr[i], &arr[largest]);
heapify(arr, n, largest); // 遞歸向下調整
}
}
#include <stdio.h>
void swap(int *a, int *b) {
int t = *a; *a = *b; *b = t;
}
void heapify(int arr[], int n, int i) {
int largest = i;
int l = 2*i + 1, r = 2*i + 2;
if (l < n && arr[l] > arr[largest]) largest = l;
if (r < n && arr[r] > arr[largest]) largest = r;
if (largest != i) {
swap(&arr[i], &arr[largest]);
heapify(arr, n, largest);
}
}
void heap_sort(int arr[], int n) {
// 建堆:從最後非葉節點開始
for (int i = n/2 - 1; i >= 0; i--)
heapify(arr, n, i);
// 排序:逐個提取堆頂
for (int i = n-1; i > 0; i--) {
swap(&arr[0], &arr[i]); // 最大值移至末尾
heapify(arr, i, 0); // 縮小堆範圍並調整
}
}
int main() {
int arr[] = {12, 11, 13, 5, 6, 7};
int n = sizeof(arr)/sizeof(arr[0]);
heap_sort(arr, n);
for (int i = 0; i < n; i++) printf("%d ", arr[i]);
return 0;
}
| 指標 | 複雜度 | 說明 |
|---|---|---|
| 時間(最好/平均/最壞) | O(n log n) | 建堆 O(n),n 次 heapify 各 O(log n) |
| 空間 | O(1) | 原地排序,遞歸棧可轉迭代 |
| 穩定性 | 不穩定 | 相等元素相對位置可能改變 |
堆排序雖不如快速排序常數因子小,但其確定性能使其在關鍵系統中不可替代。