[一个结构] 堆的实现
堆是一个数组结构,可以将其看做一个完全二叉树。
对的最重要的操作时堆的调整操作。
所谓调整是自定向下调整一个元素的位置。
如果当前元素比两个孩子小(至少一个),那么就将其和拥有最大值的孩子进行交换,知道满足他比两个孩子大,这里说的是针对最大堆。
建堆:
从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))