目录
1、堆排序
1、把数组先原地调整成堆
1.1 向上调整
1.2 向下调整
1.3 两种调整方式的时间复杂度分析
2、进行排序
1、堆排序
堆排序即利用堆的思想来进行排序,总共分为两个步骤:
1、建堆
升序:建大堆
降序:建小堆
2、利用堆删除思想来进行排序
建堆和堆删除中都用到了向下调整,因此掌握了向下调整,就可以完成堆排序。
堆排序常用方法
1、把数组先原地调整成堆
2、再进行排序
这里我们都调整为大堆
1、把数组先原地调整成堆
1.1 向上调整
1.2 向下调整
1.3 两种调整方式的时间复杂度分析
2、进行排序
排序思路:
1、把根结点和最后一个叶子结点交换,将n减1。
2、再进行调整使其维持堆的结构,一直到n减到1。
void HeapSort(int* a, int n)
{
// 向下调整成堆
for (int i = (n - 1 - 1) / 2; i >= 0; i--)
{
AdjustDown(a, n, i);
}
int end = n - 1;
//进行堆排序
while (end > 0)
{
Swap(&a[0], &a[end]);
AdjustDown(a, end, 0);
--end;
}
}
无论使用向上调整还是向下调整,整个排序的时间复杂度都是O(N*logN)
2、解决Topk问题
由堆的性质可知堆的根部结点一定是这个堆的最值(大堆为最大值,小堆为最小值)。
1、用数据集合中前K个元素来建堆
前k个最大的元素,则建小堆
前k个最小的元素,则建大堆
2、用剩余的N-K个元素依次与堆顶元素来比较,不满足则替换堆顶元素
再通过调整保持堆的结构,不断重复这个操作直到找到前k个数。