void HeapSort(int* a, int n)
{
//降序
//创建小堆
//向下调整创建,从最有一个非叶子节点
//时间复杂度O(N)
for (int i = (n-1-1)/...int end = n-1;
while (end > 0)
{
Swap(&a[0], &a[end]);
Adjustdown(a, end, 0);
end--;
}
}
首先来看向下调整算法建堆的时间复杂度...:
向下调整算法, 从最后一个非叶子结点开始向下调整, 也就是第h-1层, 需要向下移动一层, 第h-2层需要向下移动2层, … , 第一层则需要向下移动h-1层, 第二层的结点需要向下移动h-2层....对于Top-K问题,能想到的最简单直接的方式就是排序,但是:如果数据量非常大,排序就不太可取了(可能数据都不能一下子全部加载到内存中)。...例如: 求十万个数据中最大的前K个数, 要求只有1kb内存, 这些数据存储在磁盘中
首先先用前k个数建一个小堆, 剩下的N-K个元素依次与堆顶元素进行比较, 如果大于堆顶元素, 则替换堆顶元素, 并且向下调整堆