大根堆其实就是一个一维数组, 不过数组中数据的排列是基于完全二叉树模型的。根节点的数据大于等于左孩子和右孩子节点的数据,然后每个子树都和前面一样。它的主要应用是在优先级队列中, 因为大根堆或小根堆总是能很方便的找出最大的值或最小值,虽然有序的线性表一样可以实现该功能,但是有序线性表的致命缺陷在与入队时为了保持线性表仍是有序的,可能需要移动大量元素, 而大根堆和小根堆则相对有着更好的性能。
用数组来存储大根堆时,可以从第1个元素开始存储,这样的好处是可以很方便的求出当前元素的父亲结点和孩子结点。 如当前元素下标是i,则他的左孩子为2*i, 右孩子为2I + 1,父亲结点为i/2。
//heap.h
#ifndef HEAP_H_
#define HEAP_H_
#include <stdio.h>
#define MAX_ELEMENTS 200
typedef struct Element{
int key;
/*other field*/
}Element;
typedef struct Heap{
Element heap[MAX_ELEMENTS];
int n;
}Heap;
void initHeap(Heap *php);
void push(Heap * php, Element e);//插入大根堆
Element pop(Heap *php);//删除根结点
void showHeap(Heap * php);
void setvalue(Heap * php, int index, int value);// 修改第index个元素的key为value