堆排序是一種基於二叉堆結構的選擇排序,時間複雜度穩定為 O(n log n),空間複雜度 O(1),不穩定。本文提供完整、可編譯運行的 C 語言實現,並逐步拆解關鍵函數邏輯。
#include\ #include \ void swap(int A[], int i, int j) {\ int tmp = A[i];\ A[i] = A[j];\ A[j] = tmp;\ }\ void Max_Heap(int A[], int heap_size, int i) {\ int l = 2 * i + 1;\ int r = 2 * i + 2;\ int largest = i;\ if (l < heap_size && A[l] > A[largest]) largest = l;\ if (r < heap_size && A[r] > A[largest]) largest = r;\ if (largest != i) {\ swap(A, largest, i);\ Max_Heap(A, heap_size, largest);\ }\ }\ void buildHeap(int A[], int length) {\ for (int i = length / 2 - 1; i >= 0; i--) {\ Max_Heap(A, length, i);\ }\ }\ void heapSort(int A[], int length) {\ buildHeap(A, length);\ for (int i = length - 1; i >= 0; i--) {\ swap(A, i, 0);\ Max_Heap(A, i, 0);\ }\ }\ int main() {\ int A[] = {9, 8, 1, 6, 5, 4, 3, 2, 7, 0};\ heapSort(A, 10);\ for (int i = 0; i < 10; i++) {\ printf("%d\\t", A[i]);\ }\ printf("\\n");\ return 0;\ }
swap:元素交換標準三步交換,作為堆調整的基本操作。
Max_Heap:維護大頂堆性質A、當前堆大小 heap_size、待調整節點索引 i。l=2i+1、r=2i+2。i、l、r 中找出最大值索引 largest。largest != i,交換並遞歸向下調整受影響的子樹。buildHeap:構建初始大頂堆length/2 - 1 開始,逆序調用 Max_Heap。heapSort:排序主流程buildHeap 構建大頂堆,此時 A[0] 為最大值。A[0] 與當前堆尾 A[i] 交換,最大值歸位。i),對新堆頂調用 Max_Heap 恢復堆性質。0 1 2 3 4 5 6 7 8 9
| 特性 | 說明 |
|---|---|
| 時間複雜度 | 最好/平均/最壞均為 O(n log n) |
| 空間複雜度 | O(1) 原地排序 |
| 穩定性 | 不穩定(相等元素相對位置可能改變) |
| 適用場景 | 大規模數據、實時系統、內存受限環境 |
l < heap_size 而非 l <= heap_size,因索引從 0 開始。堆排序以其穩定的性能表現和極低的空間開銷,成為嵌入式系統、標準庫實現(如 glibc qsort 退化時)的首選算法之一。掌握其 C 語言實現,有助於深入理解數據結構與算法工程化。