#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>
const int maxn = 1e4 + 50;
const int INF = 0x3f3f3f3f;
const int MinData = -INF;
const int MaxData = INF;
int sum = 0;
typedef struct HeapNode* Heap;
typedef struct HeapNode {
int* value;
int size;
int length;
};
int isEmpty(Heap H) {//判断是否为空堆
return H->size == 0 ? 1 : 0;
}
int isFull(Heap H) {//判断是否堆满
return H->size == H->length ? 1 : 0;
}
Heap init_minHeap(int maxSize) {//初始化最小堆
Heap H = (Heap)malloc(sizeof(struct HeapNode));
H->value = (int*)malloc((maxSize + 1) * sizeof(int));
H->size = 0;
H->length = maxSize;
H->value[0] = MinData;
return H;
}
void insertMin(Heap H, int x) {//小顶堆插入
if (isFull(H)) {
printf("The Heap is full.\n");
return;
}
int i;
for (i = ++H->size; x < H->value[i / 2]; i /= 2) {
H->value[i] = H->value[i / 2];
}
H->value[i] = x;
}
int deleteMin(Heap H) {//小顶堆删除
int minvalue, lastvalue, child, parent;
if (isEmpty(H)) {
printf("The Heap is empty.\n");
return -1;
}
minvalue = H->value[1];
lastvalue = H->value[H->size--];
for (parent = 1; parent <= H->size; parent = child) {
child = 2 * parent;
if (child != H->size && H->value[child] > H->value[child + 1])child++;
if (lastvalue < H->value[child])break;
else H->value[parent] = H->value[child];
}
H->value[parent] = lastvalue;
return minvalue;
}
void buildMinHeap(Heap H, int n) {//创建小顶堆
int parent, child, root, lastvalue;
if (n > H->length) {
printf("创建元素大于堆的最大容量,创建失败。\n");
return;
}
for (int i = 1; i <= n; ++i) {
int x;
scanf("%d", &x);
H->value[i] = x;
}
H->size = n;
root = n / 2;
while (root) {
lastvalue = H->value[root];
for (parent = root; 2 * parent <= H->size; parent = child) {
child = 2 * parent;
if (child != H->size && H->value[child] > H->value[child + 1])child++;
if (lastvalue < H->value[child])break;
else H->value[parent] = H->value[child];
}
H->value[parent] = lastvalue;
root--;
}
}
Heap init_maxHeap(int maxSize) {//初始化最大堆
Heap H = (Heap)malloc(sizeof(struct HeapNode));
H->value = (int*)malloc((maxSize + 1) * sizeof(int));
H->size = 0;
H->length = maxSize;
H->value[0] = MaxData;
return H;
}
void insertMax(Heap H, int x) {//大顶堆插入
if (isFull(H)) {
printf("The Heap is full.\n");
return;
}
int i;
for (i = ++H->size; x > H->value[i / 2]; i /= 2) {
H->value[i] = H->value[i / 2];
}
H->value[i] = x;
}
int deleteMax(Heap H) {//大顶堆删除
int maxvalue, lastvalue, child, parent;
if (isEmpty(H)) {
printf("The Heap is empty.\n");
return -1;
}
maxvalue = H->value[1];
lastvalue = H->value[H->size--];
for (parent = 1; parent <= H->size; parent = child) {
child = 2 * parent;
if (child != H->size && H->value[child] < H->value[child + 1])child++;
if (lastvalue >= H->value[child])break;
else H->value[parent] = H->value[child];
}
H->value[parent] = lastvalue;
return maxvalue;
}
void buildMaxHeap(Heap H, int n) {//创建大顶堆
int parent, child, root, lastvalue;
if (n > H->length) {
printf("创建元素大于堆的最大容量,创建失败。\n");
return;
}
for (int i = 1; i <= n; ++i) {
int x;
scanf("%d", &x);
H->value[i] = x;
}
H->size = n;
root = H->size / 2;
while (root) {
lastvalue = H->value[root];
for (parent = root; 2 * parent <= H->size; parent = child) {
child = 2 * parent;
if (child != H->size && H->value[child] < H->value[child + 1])child++;
if (lastvalue >= H->value[child])break;
else H->value[parent] = H->value[child];
}
H->value[parent] = lastvalue;
root--;
}
}
void minHeapSort(Heap H) {//小顶堆,降序
int Size = H->size;
while (Size > 1) {
int temp = H->value[1];
H->value[1] = H->value[Size];
H->value[Size] = temp;
Size--;
int root, lastvalue, parent, child;
root = Size / 2;
while (root) {
lastvalue = H->value[root];
for (parent = root; 2 * parent <= Size; parent = child) {
child = 2 * parent;
if (child != Size && H->value[child] > H->value[child + 1])child++;
if (lastvalue < H->value[child])break;
else H->value[parent] = H->value[child];
}
H->value[parent] = lastvalue;
root--;
}
}
}
void maxHeapSort(Heap H) {//大顶堆,升序
int Size = H->size;
while (Size > 1) {
int temp = H->value[1];
H->value[1] = H->value[Size];
H->value[Size] = temp;
Size--;
int root, lastvalue, parent, child;
root = Size / 2;
while (root) {
lastvalue = H->value[root];
for (parent = root; 2 * parent <= Size; parent = child) {
child = 2 * parent;
if (child != Size && H->value[child] < H->value[child + 1])child++;
if (lastvalue >= H->value[child])break;
else H->value[parent] = H->value[child];
}
H->value[parent] = lastvalue;
root--;
}
}
}
void print(Heap H) {
for (int i = 1; i <= H->size; ++i) {
printf("%d ", H->value[i]);
}
printf("\n");
}
int main() {
int n;
int cnt = 1;
while (~scanf("%d", &n)) {
if (n == -1)break;
Heap H;
H = init_maxHeap(maxn);
buildMaxHeap(H, n);
maxHeapSort(H);
printf("Case %d: %d\n", cnt++, n);
print(H);
}
return 0;
}
输入:
5
10 1 8 4 30
7
35 60 50 2 20 4 86
3
38 100 45
-1
输出:
Case 1: 5
1 4 8 10 30
Case 2: 7
2 4 20 35 50 60 86
Case 3: 3
38 45 100