剑指offer-最小的K个数

2016/05/24 C和C++基础

题目描述

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。

#include <iostream>
#include <vector>
#include <set>;
using namespace std;

void findKMaxnum(vector<int> vec,int k){
	set<int> s;
	for(int i=0;i<k;i++)
		s.insert(vec[i]);

	int len=vec.size();
	set<int>::iterator it;
	for(int i=k;i<len;i++){
		it=s.end();
		it--;
		if(*it>vec[i]){
			s.erase(it);
			s.insert(vec[i]);
		}
	}
}

int main(){
	int a[10]={5,7,4,8,1,2,9,3,6,0};
	vector<int> vec(a,a+10);
	findKMaxnum(vec,4);

	system("pause");
}

思路:

基于堆排序算法,构建最大堆。时间复杂度为O(nlogk)

如果用快速排序,时间复杂度为O(nlogn)

如果用冒泡排序,时间复杂度为O(n*k)

Search

    Post Directory