5.15 训练日志

      总结一下最近学的数据结构——堆。
      堆数据结构是一种数组对象,它可以被视为一科完全二叉树结构。它的特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆)。它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等。
      堆是一棵完全二叉树,高度为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); //交换后新的根元素可能委培了最大堆的性质
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值