/*
*寻找最小的k个数
*题目描述:5.查找最小的k个元素
*题目:输入n个整数,输出其中最小的k个。
*例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。
*
*采用维护n个元素的最小堆的方法来实现
*时间复杂度为O(n*logk)
*/
#include <iostream>
#include <vector>
#include <assert.h>
using namespace std;
int leftChild(int i)
{
return 2*i + 1;
}
int rightChild(int i)
{
return 2*i +2;
}
int parent(int i)
{
return (i+1)/2 -1;
}
bool exchange(vector<int>& vi,int i,int j)
{
int tmp = vi[i];
vi[i] = vi[j];
vi[j] =tmp;
}
void heap_min_adjust(vector<int>& vi,int n,int index)
{
assert(index <= n);
int min = index;
int left = leftChild(index);
int right = rightChild(index);
if(left <= n && vi[left] < vi[min])
{
min = left;
}
if(right <= n && vi[right] < vi[min])
{
min = right;
}
if(min != index)
{
int tmp = vi[index];
vi[index] = vi[min];
vi[min] = tmp;
heap_min_adjust(vi,n,min);
}
}
void heap_make(vector<int>& vi,int n)
{
int partition = n/2 -1;
for(int i = partition; i >= 0;--i)
{
heap_min_adjust(vi,n,i);
}
}
int main(int argc,char **argv)
{
vector<int> vi;
vi.push_back(5);
vi.push_back(1);
vi.push_back(4);
vi.push_back(6);
vi.push_back(2);
vi.push_back(3);
vi.push_back(8);
vi.push_back(7);
heap_make(vi,vi.size()-1);
int k = 3;
//cout<<vi[0]<<endl;
for(int i = 0;i < k; ++i)
{
cout<<vi[0]<<endl;
exchange(vi,0,vi.size()-1);
vi.pop_back();
heap_min_adjust(vi,vi.size()-1,0);
}
return 0;
}
寻找最小的k个数(采用维护n个元素的最小堆的方法来实现)
最新推荐文章于 2020-11-20 08:34:54 发布