[一个结构] 堆的实现

堆是一个数组结构,可以将其看做一个完全二叉树。

对的最重要的操作时堆的调整操作。

所谓调整是自定向下调整一个元素的位置。

如果当前元素比两个孩子小(至少一个),那么就将其和拥有最大值的孩子进行交换,知道满足他比两个孩子大,这里说的是针对最大堆。

建堆:

从n/2到0个孩子依次进行堆得调整操作,最后会得到得到符合对的性质的堆。

总的时间复杂度是O(N)

堆排序:

依次将堆顶元素和堆尾元素进行兑换,并且将堆得带下减一,对堆顶元素进行堆得调整操作。

再次进行上面的操作,直到

数组下标从1开始进行计数

一、一个很重要的操作,对堆元素进行调整

heapfiy(int []num, int index):

  if(index>length) return;

  int left = 2* index;

  int right = 2*index+1;

  if(left>length&&right>length) return;

  int maxnum = max(num[left],num[right]);

  maxnum = max(maxnum,num[index]);

  if(maxnum==num[left]):

    swap(num,index,left);

    heapfiy(num,left);

  else

    swap(num,index,right);

    heapfly(num,right);

end

 

二、堆的初始化

for i=length/2;i>=0;i--

  heapfly(num,i);

end

初始化的复杂度是O(N)

 

三、堆排序

for i=1:length

  swap(num,i,length);

  length--;

  heapfly(num,1);

end

O(Nlog(N))

 

转载于:https://www.cnblogs.com/deepblueme/p/4770081.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值