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

  • 相关阅读:
    关系图的缩放、拖移、边上的关系显示、自定义等
    数据嵌入js的关系图
    十二周周四
    去除mysql里面重复的行并留下id最小的
    十一周周日
    十一周周六
    计算一个字符串中每个词的数量并降序输出
    账户 需求分析
    《人月神话》阅读计划
    读博客,了解本学期《软件需求与分析》掌握必要的内容
  • 原文地址:https://www.cnblogs.com/aLittleBitCool/p/1938733.html
Copyright © 2020-2023  润新知