代码借鉴于浙江大学MOOC《算法与数据结构》课程。
第一行输入结点个数n
第二行输入n个数,建立最小堆
#include<stdio.h>
#include <stdlib.h>
#define ElementType int
#define MinData 1000;
typedef struct HeapStruct* MinHeap;
struct HeapStruct{
ElementType *Elements;
int Size;
int Capacity;
};
MinHeap Creat(int MaxSize)
{
MinHeap H = malloc(sizeof(struct HeapStruct));
H->Elements = malloc((MaxSize + 1) * sizeof(ElementType));
H->Size = 0;
H->Capacity = MaxSize;
return H;
}
int IsFull(MinHeap H)
{
if(H->Size < H->Capacity) return 0;
else return 1;
}
int IsEmpty(MinHeap H)
{
if(H->Size == 0) return 1;
else return 0;
}
void Insert(MinHeap H, ElementType item)
{
int i;
if(IsFull(H)) {
printf("full");
return;
}
i = ++H->Size;
for( ; i > 1 && H->Elements[i/2] > item; i /= 2)
H->Elements[i] = H->Elements[i/2];
H->Elements[i] = item;
}
ElementType Delete(MinHeap H)
{
int Parent, Child;
ElementType MinItem, temp;
if(IsEmpty(H)) {
printf("empty");
return -1;
}
MinItem = H->Elements[1];
temp = H->Elements[H->Size--];
for(Parent = 1; Parent * 2 <= H->Size; Parent = Child) {
Child = Parent * 2;
if((Child != H->Size) && (H->Elements[Child] > H->Elements[Child + 1]))
Child++;
if(temp <= H->Elements[Child]) break;
else H->Elements[Parent] = H->Elements[Child];
}
H->Elements[Parent] = temp;
return MinItem;
}
int main()
{
int N, i;
scanf("%d", &N);
MinHeap minh = Creat(N);
for(i = 0; i < N; i++) {
int temp;
scanf("%d", &temp);
Insert(minh, temp);
}
return 0;
}