编写代码,实现最小堆(Min-Heap)的操作。
输入格式:
第一行是两个不大于1000
的正整数N
和K
,用空格间隔。其中N
是堆的容量,需创建一个容量为N
的堆。
接下来K
行,是对这个堆的依次的K
项插入或删除操作:用 1 x
表示插入元素x;用 -1
表示删除堆顶。
接下来一行是一个不大于1000
的正整数M
,
接下来一行是M
个整数(在整型范围内),用空格间隔,
要求将这M
个整数组成的列表调整为一个最小堆。
输出格式:
对于第一个堆的K
项操作,每次操作后,在一行中依次序打印堆元素,元素间使用1个空格分隔;
对于第二个堆,在调整完成后,在一行中依次序打印堆元素,元素间使用1个空格分隔。
输入样例:
10 8
1 1
1 2
1 3
1 4
1 5
-1
1 6
-1
8
1 2 3 4 5 6 7 8
输出样例:
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
2 4 3 5
2 4 3 5 6
3 4 6 5
1 2 3 4 5 6 7 8
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define MINDATA -32368
typedef struct HNode* Heap;
typedef Heap MinHeap;
struct HNode {
int* Data;
int Size;
};
MinHeap CreateHeap(int MaxSize) {
MinHeap H = (MinHeap)malloc(sizeof(struct HNode));
H->Data = (int*)malloc((MaxSize + 1) * sizeof(int));
H->Size = 0;
H->Data[0] = MINDATA;
return H;
}
void Insert(MinHeap H, int X) {
int i;
i = ++H->Size;
for (; H->Data[i / 2] > X; i /= 2)
H->Data[i] = H->Data[i / 2];
H->Data[i] = X;
}
int DeleatMin(MinHeap H) {
int Parent, Child;
int MinItem, X;
MinItem = H->Data[1];
X = H->Data[H->Size--];
for (Parent = 1; Parent * 2 <= H->Size; Parent = Child) {
Child = Parent * 2;
if ((Child != H->Size) && (H->Data[Child] > H->Data[Child + 1]))
Child++;
if (X <= H->Data[Child])break;
else
H->Data[Parent] = H->Data[Child];
}
H->Data[Parent] = X;
return MinItem;
}
int main() {
int N, K, M, X, flag, count = 0;
Heap H1, H2;
scanf("%d%d", &N, &K);
if (N >= 1000 || K > 1000)return 0;
H1 = CreateHeap(N);
for (int i = 0; i < K; i++) {
scanf("%d", &flag);
if (flag == 1) {
scanf("%d", &X);
Insert(H1, X);
count++;
}
else if (flag == -1) {
DeleatMin(H1);
count--;
}
for (int j = 1; j <= count; j++) {
if (j != 1)printf(" ");
printf("%d", H1->Data[j]);
}
printf("\n");
}
scanf("%d", &M);
if (M > 1000)return 0;
H2 = CreateHeap(M);
for (int i = 0; i < M; i++) {
scanf("%d", &X);
Insert(H2, X);
}
for (int i = 1; i <= M; i++) {
if (i != 1)printf(" ");
printf("%d", H2->Data[i]);
}
system("pause");
return 0;
}