总结一下最近学的数据结构——堆。
堆数据结构是一种数组对象,它可以被视为一科完全二叉树结构。它的特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆)。它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等。
堆是一棵完全二叉树,高度为O(lg n),其基本操作至多与树的高度成正比。
get操作
void Heapify(int A[],int i)
{
int l=LEFT(i);
int r=RIGHT(i);
int largest;
if(l<=HEAP_SIZE(A)) largest=A[l]>A[i]?l:i;
if(r<=HEAP_SIZE(A)) largest=A[r]>A[largest]?r:largest; //从i,2i,2i+1中找出最大的一个
if(largest!=i) //i不是最大的
{
swap(A[i],A[largest]);
Heapify(A,largest); //交换后,子树有可能违反最大堆性质
}
}
put操作
void Insert(int A[], int i) { //i为插入的值
int n=++HEAP_SIZE(A);
A[n] = -99999;//小无穷
int p = n;
while(p >1 && A[PARENT§] < i) {
A[p] = A[PARENT§];
p = PARENT§;
}
A[p]=i;
}
新建堆操作
void BuildHeap(int A[],)
{
int i;
for(i = HEAP_SIZE(A)/2; i>=1; i–)
Heapify(A, i);
}
堆排序
void HeapSort(int A[])
{
BuildHeap(A);
for(i=HEAP_SIZE(A),i>1; i–)
{
swap(A[1],A[i]);
HEAP_SIZE(A)=HEAP_SIZE(A)-1;
Heapify(A,1); //交换后新的根元素可能委培了最大堆的性质
}
}