java堆排序解决topk问题,利用堆排序来解决topK问题

在这里利用了C++的几个函数(这几个API接口需要algorithm):

分享一下如何使用STL里的heap(堆)算法。堆是一个完全二叉树。在STL中,heap是算法的形式提供给我们使用的。包括下面几个函数:

四个最常用的API接口

make_heap: 根据指定的迭代器区间以及一个可选的比较函数,来创建一个heap. O(N).

push_heap: 把指定区间的最后一个元素插入到heap中. O(logN).

pop_heap: 弹出heap顶元素, 将其放置于区间末尾. O(logN).

sort_heap:堆排序算法,通常通过反复调用pop_heap来实现. N*O(logN).

*注:

C++11加入了两个新成员:

is_heap: 判断给定区间是否是一个heap. O(N)

is_heap_until: 找出区间中第一个不满足heap条件的位置. O(N)

因为heap以算法的形式提供,所以要使用这几个api需要包含 #include

class Solution {

public:

void adjust2(vector &arr,int pos,int size){

int left = 2*pos+1;

int right = 2*pos+2;

int index = pos;

if(left

if(right < size && arr[index]

if(index != pos){

swap(arr[index],arr[pos]);

adjust2(arr,index,size);

}

return;

}

void make_heap2(vector &arr){

for(int i=arr.size()-1;i>=1;i--){

swap(arr[0],arr[i]);

adjust2(arr,0,i);

}

}

vector getLeastNumbers(vector& arr, int k) {

vector tmp;

if(k==0) return tmp;

for(int i=0;i

tmp.push_back(arr[i]);;

}

make_heap(tmp.begin(),tmp.end(),less());

for(int i=k;i

if(arr[i]

tmp[0] = arr[i];

adjust2(arr,0,k);

}

}

make_heap2(tmp);

return tmp;

}

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值