分析
用到大顶堆、小顶堆的知识点,正好复习一下:
求第k大和前k个大的元素要用大顶堆还是小顶堆呢?
如果直观的用大顶堆的话,堆顶是堆的最大值,而我们需要选出前K个最大的数据。如果我们在建堆时最大值被放到了对顶,那之后的k-1个次大值无法放入堆中。所以,选用最大堆只能找出k中的一些最大值,而不是全部。
所以我们选用小顶堆,如果大于堆顶最小值则替换堆顶值放入堆中,再调整为最小堆,最终小顶堆存放前k个大元素,堆顶是第k个大元素。
代码
//
// 27-TopK.cpp
// Cracking-the-code
//
// Created by mac on 2019/3/28.
// Copyright © 2019 iris. All rights reserved.
//
#include <iostream>
using namespace std;
void swap(int * a, int i, int j) {
a[i] = a[i]^a[j];
a[j] = a[i]^a[j];
a[i] = a[i]^a[j];
}
//对parent及其子节点调整为最小堆O(logK)
void adjustDown(int *a, int parent, int K) {
int child = parent * 2 + 1;
while (child < K) {
//和左右孩子节点中中最小的那个交换
if (a[child] > a[child+1]) {
++child;
}
if (a[parent] > a[child]) {
swap(a, parent, chil