F_G

许多问题需要说清楚就可以&&走永远比跑来的重要

导航

[一个结构] 堆的实现

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

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

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

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

建堆:

从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))

 

posted on 2015-08-29 23:28  F_G  阅读(283)  评论(0编辑  收藏  举报