堆的应用
1)排序 堆排序
选择排序
既可以找到最大的放在最后
也可以找到最小的方最前
但是,堆排序不能找最小的放在最前
因为把最小数放在最前,会破坏掉堆的原来的顺序,除非重新建堆
1, 2,9,16,7,15,18,45,37,63,13
63,45,18,16,37,9,2,7,15,13,1
1,45,18,16,37,9,2,7,15,13, 63 再向下调整即可
堆排序:
排升序,建大堆
排降序,建小堆
原因:重新调整回根的成本更小,向下调整(O(logn))<建队O(n)
伪代码
int array[] int size;堆排序,排升序
建大堆
i=0;i的意义是被选出的最大的数的个数
for(i<size-1){
//一次循环,找出一个最大的数放在最后
Swap(&array[0],&array[size-1-i])
//向下调整
AdjustDown(array,size-1-i,0);
}
建堆函数
向下调整函数
TopK问题
再海量数据中(n>>100*1000),找最大的k=10个数
建小堆