堆
特性
- 结构性:用数组表示的完全二叉树;
- 有序性:任意节点的关键字是其子树所有节点的最大值(最大堆)或最小值(最小堆)。
最大堆的操作
typedef struct HeapStruct *MaxHeap
struct HeapStruct
{
ElemType *Elem;
int size;
int capacity;
};
MaxHeap Create(int MaxSize)
{
MaxHeap H = malloc(sizeof(struct HeapStruct));
H -> ELem = malloc(sizeof(ElemType) * (MaxSize + 1));
H -> size = 0;
H -> capacity = MaxSize;
H -> Elem[0] = MAXDATA;
return H;
}
void Insert(MaxHeap H, ElemType item)
{
int i;
if(IsFull(H))
reutrn;
i = ++ H -> size;
for(; H -> Elem[i / 2] < item; i /= 2)
H -> Elem[i] = H -> Elem[i / 2];
H -> Elem[i] = item;
}
- 最大堆的删除(取出根节点(最大值),然后对剩余节点重新排序,使之依然满足堆的特性)
ElemType DeleteMax(MaxHeap H)
{
int parent, child;
ElemType max_item, rear_item;
if(isempty(H))
retrun;
max_item = H -> Elem[1];
rear_item = H ->Elem[H -> size --];
for(parent = 1; parent * 2 <= H -> size; parent = child)
{
child = parent * 2;
if(child != H -> size && H -> Elem[child] < H -> Elem[child + 1])
child ++;
if(rear_item >= H -> Elem[child])
break;
else
H -> Elem[parent] = H -> Elem[child];
}
H -> Elem[parent] = rear_item;
return max_item;
}
- 最大堆的建立(将已经存在的N个元素按最大堆的要求存放在一个一位数组中)
void SortHeap(MaxHeap H, int position)
{
int parent, child;
ElemType root_item;
root_item = H -> Elem[p];
for(parent = 1; parent * 2 <= H -> size; parent = child)
{
child = parent * 2;
if(child != H -> size && H -> Elem[child] < H -> Elem[child + 1])
child ++;
if(root_item >= H -> Elem[child])
break;
else
H -> Elem[parent] = H -> Elem[child];
}
H -> Elem[parent] = root_item;
}
void BuildHeap(MaxHeap H)
{
for(int i = H -> size / 2; i > 0; i --)
SortHeap(H, i);
}