本專欄持續輸出數據結構題目集,歡迎訂閱。
文章目錄
- 題目
- 代碼
題目
請編寫程序,將 n 個順序存儲的數據用快速建堆操作調整為最小堆;最后順次輸出堆中元素以檢驗操作的正確性。
輸入格式:
輸入首先給出一個正整數 c(≤1000),為最小堆的最大容量;下一行給出正整數 n(≤c);隨后一行給出 n 個元素。所有元素均為 int 型范圍內的整數。
輸出格式:
在 n 行中按層序遍歷的順序每行輸出一個最小堆元素。
輸入樣例:
10
6
7 3 9 5 2 8
輸出樣例:
2
3
8
5
7
9
代碼
#include <stdio.h>
#include <stdlib.h>void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;
}// 向下調整堆,維護最小堆性質
void siftDown(int arr[], int n, int i) {int smallest = i;int left = 2 * i + 1;int right = 2 * i + 2;if (left < n && arr[left] < arr[smallest])smallest = left;if (right < n && arr[right] < arr[smallest])smallest = right;if (smallest != i) {swap(&arr[i], &arr[smallest]);siftDown(arr, n, smallest);}
}// 快速建堆:Floyd算法,自底向上調整非葉子節點
void buildHeap(int arr[], int n) {for (int i = n / 2 - 1; i >= 0; i--)siftDown(arr, n, i);
}int main() {int c, n;scanf("%d", &c);scanf("%d", &n);int *arr = (int *)malloc(c * sizeof(int));for (int i = 0; i < n; i++)scanf("%d", &arr[i]);buildHeap(arr, n);// 按層序遍歷輸出(數組順序即為層序)for (int i = 0; i < n; i++)printf("%d\n", arr[i]);return 0;
}