查找最小的k个元素

题目:输入n个整数,输出其中最小的k个。

例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。

晕了,发现自己有很多东西都还需要学,最郁闷的就是谓词那里了......

 

//make_heap
//谓词的使用
#include<iostream>
#include<algorithm>
#include<vector>
#include <functional> 
using namespace std;
void find(vector<int> &a,int n){
	make_heap(a.begin(),a.begin()+n);
	if(a.size()<n) return;
	for(vector<int>::size_type i=n;i<a.size();i++){
		if(a[i]<a[0]){
			a[0]=a[i];
			make_heap(a.begin(),a.begin()+n);
		}
	}
	for(vector<int>::size_type i=0;i<n;i++)
		cout<<a[i]<<" ";
	cout<<endl;
	nth_element(a.begin(),a.begin(),a.end(),less<int>());//最后传递的是一个对象
	for(vector<int>::size_type i=0;i<n;i++)
		cout<<a[i]<<" ";
	cout<<endl;
}
int main(void){
	vector<int> a;
	for(int i=1;i<=8;i++)
		a.push_back(i);
	find(a,4);
	system("pause");
return 0;
}

最让人郁闷的是nth_element的地方,就是cmp函数的问题,这个东西从大一开始用qsort函数就一直有了,代码出错了N次,改成下面这个也可以用了

bool cmp(int  &a,int &b){
	return a < b;
}
void find(vector<int> &a,int n){
	make_heap(a.begin(),a.begin()+n);
	if(a.size()<n) return;
	for(vector<int>::size_type i=n;i<a.size();i++){
		if(a[i]<a[0]){
			a[0]=a[i];
			make_heap(a.begin(),a.begin()+n);
		}
	}
	for(vector<int>::size_type i=0;i<n;i++)
		cout<<a[i]<<" ";
	cout<<endl;
	nth_element(a.begin(),a.begin(),a.end(),cmp);//改成cmp
	for(vector<int>::size_type i=0;i<n;i++)
		cout<<a[i]<<" ";
	cout<<endl;
}

原文地址:https://www.cnblogs.com/aLittleBitCool/p/1938733.html