注意:元素从下标为1开始存储,下标为0,存储最大值,用做哨兵;
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXDATA = 1e6;
typedef struct Node
{
int *Data;
int Size;
int MaxSize;
}*MaxHeap;
MaxHeap CreatHeap(int maxSize)
{
MaxHeap H = (MaxHeap)malloc(sizeof(Node));
H->Data = (int *)malloc((maxSize + 1) * sizeof(int));
H->Data[0] = MAXDATA;
H->MaxSize = maxSize;
H->Size = 0;
return H;
}
bool isFull(MaxHeap H)
{
return H->Size == H->MaxSize;
}
bool isEmpty(MaxHeap H)
{
return H->Size == 0;
}
bool Insert(MaxHeap H, int X)
{
if(isFull(H))
{
cout << "堆已满" <<endl;
return false;
}
int pos = ++H->Size;
for(pos; H->Data[pos / 2] < X; pos /= 2)
{
H->Data[pos] = H->Data[pos / 2];
}
H->Data[pos] = X;
return true;
}
bool DeleteMax(MaxHeap H)
{
if(isEmpty(H))
{
cout << "堆为空" <<endl;
return false;
}
int Parent, Child;
int MaxElement = H->Data[1];
int 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 MaxElement;
}
void PerDown(MaxHeap H, int p)
{
int Parent, Child;
int X = H->Data[p];
for(Parent = p; 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;
}
void BuildHeap(MaxHeap H)
{
for(int i = H->Size / 2; i > 0; i--) PerDown(H, i);
}
int main()
{
MaxHeap H;
CreatHeap(10010);
for(int i = 1; i < 100; i++)
cin >> H->Data[i],H->Size++;
BuildHeap(H);
Insert(H, 98);
DeleteMax(H);
return 0;
}