优先队列(Priority Queue):特殊的“队列”,取出元素的顺序是 依照元素的优先权(关键字)大小,而不是元素进入队列的先后顺序。
如何用一种数据结构来组织堆:完全二叉树,树根就是此时数据优先度最高的,随着数据的插入删除,优先度最高的树根也在动态变化。
完全二叉树的表示:一维数组,其中arr[0]为哨兵元素。
typedef struct HeapStruct *MaxHeap;
struct HeapStruct {
ElementType *Elements; /* 存储堆元素的数组 */
int Size;
int Capacity;
};
MaxHeap Create( int MaxSize ) {
/* 创建容量为MaxSize的空的最大堆 */
MaxHeap H = malloc( sizeof( struct HeapStruct ) );
H->Elements = malloc( (MaxSize+1) * sizeof(ElementType));
H->Size = 0;
H->Capacity = MaxSize;
H->Elements[0] = MaxData;
/* 定义“哨兵”为大于堆中所有可能元素的值,便于以后更快操作 */
return H;
}
//最大堆的插入
void Insert( MaxHeap H, ElementType item ) {
/* 将元素item 插入最大堆H,其中H->Elements[0]已经定义为哨兵 */
if ( IsFull(H) ) {
printf("最大堆已满");
return;
}
H->Elements[++size] = item;
int i;
for(i=size;i>0;i/=2)//上滤交