查找最小的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;

}

你可能感兴趣的:(查找)