用完全二叉树来表示
特性:1.结构性,用数组表示的完全二叉树。2.有序性,任一结点的关键字是其子树所有结点的最大值(或最小值)
#include<iostream>
using namespace std;
typedef struct heap *maxheap;
struct heap{
int *elements;
int size;//堆的当前元素个数
int capacity;//最大容量
};
//创建容量为maxsize的空的最大堆
maxheap creat(int maxsize)
{
maxheap h = (heap*)malloc(sizeof(heap));
h->elements = (int*)malloc((maxsize+1)*sizeof(heap));//从下标1开始存储
h->size = 0;
h->capacity = maxsize;
h->elements[0] = INT_MAX;//哨兵
return h;
}
//插入
void insert(maxheap h, int item)
{
int i;
if(h->size == h->capacity)
{
printf("满");
return;
}
i = ++h->size;
//这插入时有点像插入排序,为item找到合适的位置
for(; h->elements[i / 2] < item; i = i / 2)
h->elements[i] = h->elements[i / 2];
h->elements[i] = item;
}
//删除
int deleteMax(maxheap h)
{
int parent, child;
int maxitem, temp;
if(h->size == 0)
{
printf("空");
return;
}
maxitem = h->elements[1];//取出根结点,也就是最大值
temp = h->elements[h->size--];//取出最后一个结点
//假设tmp是放到根结点,然后开始向下比较
for(parent = 1; parent * 2 <= h->size; parent = child)
{
child = parent * 2;
//如果有右孩子且右孩子的值大于左孩子
if((child != h->size) && (h->elements[child]) < (h->elements[child + 1]))
child++;//找到了左右孩子中更大的
//如果temp更大,那么现在这个位置他是可以“坐稳”的,跳出,否则就将更大的孩子提上来
if(temp >= h->elements[child])
break;
else
h->elements[parent] = h->elements[child];
//一趟结束后,parent就去到更大的孩子的下标的位置
}
h->elements[parent] = temp;
return maxitem;
}