什么是堆
优先队列
( (Priority Queue ):特殊的“ 队列
” ,取出元素的顺序是依照元素的 优先权(关键字)
大小,而不是元素进入队列的先后顺序。
优先队列的完全二叉树表示
bool Insert(MaxHeap H, Elemtype X)
{ int i;if (IsFull(H)){printf("最大堆已满");return false;}i &#61; &#43;&#43;H->Size; for (; H->Data[i / 2] < X; i /&#61; 2)H->Data[i] &#61; H->Data[i / 2]; H->Data[i] &#61; X; return true;
}
H->Element[ 0 ] 是哨兵元素&#xff0c;它不小于堆中的最大元素。当插入的元素比任意元素都大&#xff0c;哨兵的存在使得H->Elements[0] > item; 顺环结束。
时间复杂度&#xff1a; O(log N)
最大堆的删除
取出根结点&#xff08;最大值&#xff09;元素&#xff0c;同时删除堆的一个结点。
用最后一个结点代替根结点&#xff0c;取根结点两孩子的较大的一个&#xff0c;若较大值大于此时的根节点&#xff0c;将该较大值移动至根结点&#xff0c;不断重复&#xff0c;直到找到最后一个结点该插入的位置。
完整c&#43;&#43;代码
#include
#include
using namespace std;#define Elemtype int
#define MAXDATA 1000 typedef struct HNode {Elemtype *Data; int Size; int Capacity;
}*Heap;typedef Heap MaxHeap;
typedef Heap MinHeap; MaxHeap CreateHeap(int MaxSize)
{ MaxHeap H &#61; (MaxHeap)malloc(sizeof(struct HNode));H->Data &#61; (Elemtype *)malloc((MaxSize &#43; 1)*sizeof(Elemtype));H->Size &#61; 0;H->Capacity &#61; MaxSize;H->Data[0] &#61; MAXDATA; return H;
}bool IsFull(MaxHeap H)
{return (H->Size &#61;&#61; H->Capacity);
}bool Insert(MaxHeap H, Elemtype X)
{ int i;if (IsFull(H)){printf("最大堆已满");return false;}i &#61; &#43;&#43;H->Size; for (; H->Data[i / 2] < X; i /&#61; 2)H->Data[i] &#61; H->Data[i / 2]; H->Data[i] &#61; X; return true;
}#define ERROR -1 bool IsEmpty(MaxHeap H)
{return (H->Size &#61;&#61; 0);
}Elemtype DeleteMax(MaxHeap H)
{ int Parent, Child;Elemtype MaxItem, X;if (IsEmpty(H)) {printf("最大堆已为空");return ERROR;}MaxItem &#61; H->Data[1]; X &#61; H->Data[H->Size--]; for (Parent &#61; 1; Parent * 2 <&#61; H->Size; Parent &#61; Child){Child &#61; Parent * 2;if ((Child !&#61; H->Size) && (H->Data[Child]<H->Data[Child &#43; 1]))Child&#43;&#43;; if (X >&#61; H->Data[Child]) break; else H->Data[Parent] &#61; H->Data[Child];}H->Data[Parent] &#61; X;return MaxItem;
}
void PercDown(MaxHeap H, int p)
{ int Parent, Child;Elemtype X;X &#61; H->Data[p]; for (Parent &#61; p; Parent * 2 <&#61; H->Size; Parent &#61; Child) {Child &#61; Parent * 2;if ((Child !&#61; H->Size) && (H->Data[Child]<H->Data[Child &#43; 1]))Child&#43;&#43;; if (X >&#61; H->Data[Child]) break; else H->Data[Parent] &#61; H->Data[Child];}H->Data[Parent] &#61; X;
}void BuildHeap(MaxHeap H)
{ int i;for (i &#61; H->Size / 2; i>0; i--)PercDown(H, i);
}int main()
{Heap heap &#61; CreateHeap(20);int a[13] &#61; { MAXDATA, 79, 66, 43, 83, 30, 87, 38, 55, 91, 72, 49, 9 };int len &#61; sizeof(a) / sizeof(a[0]);heap->Data &#61; a;heap->Size &#61; len-1;BuildHeap(heap);for (int i &#61; 1; i <&#61; heap->Size; i&#43;&#43;)cout << heap->Data[i]<<" ";cout << endl << endl;cout << DeleteMax(heap) << endl;for (int i &#61; 1; i <&#61; heap->Size; i&#43;&#43;)cout << heap->Data[i] << " ";cout << endl << endl;if (Insert(heap, 99)){for (int i &#61; 1; i <&#61; heap->Size; i&#43;&#43;)cout << heap->Data[i] << " ";}
}