本專欄持續輸出數據結構題目集,歡迎訂閱。
文章目錄
- 題目
- 代碼
題目
請編寫程序,將 n 個順序存儲的數據用樸素建堆操作調整為最小堆;最后順次輸出堆中元素以檢驗操作的正確性。
輸入格式:
輸入首先給出一個正整數 c(≤1000),為最小堆的最大容量;下一行給出正整數 n(≤c);隨后一行給出 n 個元素。所有元素均為 int 型范圍內的整數。
輸出格式:
在 n 行中按層序遍歷的順序每行輸出一個最小堆元素。
輸入樣例:
10
6
7 3 9 5 2 8
輸出樣例:
2
3
8
7
5
9
代碼
#include <stdio.h>
#include <stdlib.h>void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;
}// 向上調整堆,維護最小堆性質
void siftUp(int arr[], int i) {while (i > 0) {int parent = (i - 1) / 2;if (arr[i] >= arr[parent])break;swap(&arr[i], &arr[parent]);i = parent;}
}// 樸素建堆方法:逐個插入元素
void buildHeapNaive(int arr[], int n) {for (int i = 1; i < n; i++)siftUp(arr, 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]);buildHeapNaive(arr, n);// 按層序遍歷輸出for (int i = 0; i < n; i++)printf("%d\n", arr[i]);return 0;
}