博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ Exercises(十)
阅读量:6815 次
发布时间:2019-06-26

本文共 2403 字,大约阅读时间需要 8 分钟。

1.1 找出第K大的数
方法1:
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
int main()
{
    int data[] = {3,54,254,52,13,667,234,67,256,78,467,32,65,324,889,34,5};
    int len = sizeof(data)/sizeof(int);
    vector<int> v1(data,data+len);
    ostream_iterator<int> out(cout," ");
    copy(v1.begin(),v1.end(),out);
    cout<<endl;
    sort(v1.begin(),v1.end(),greater<int>());
    copy(v1.begin(),v1.end(),out);
    cout<<endl;
    int k;
    cin>>k;
    cout<<v1[k-1]<<endl;
    system("pause");
    return 0;
}
方法2:
#include <iostream>
#include <list>
#include <algorithm>
#include <iterator>
using namespace std;
class LessThan
{
public:
       LessThan(int val):value(val){}
       ~LessThan(){}
       bool operator()(int rhs)
       {
            return rhs<=value;
       }
private:
        int value;
};
int main()
{
    int data[] = {3,54,254,52,475,667,234,67,256,78,467,32,65,324,889,34,5};
    int len = sizeof(data)/sizeof(int);
    int k;
    cin>>k;
    list<int> list1(data,data+k);
    ostream_iterator<int> out(cout," ");
    list1.sort(greater<int>());//对前K个数进行排序
    list<int>::iterator pos;
    for(int i=k;i<len;++i)
    {
        if(data[i]>list1.back())
        {//比最后一个元素大
           pos = find_if(list1.begin(),list1.end(),LessThan(data[i]));//找到第一个比要插入值小的元素位置    
           list1.insert(pos,data[i]);//插入新值
           list1.pop_back();//删除最后一个多余的元素
        }          
    } 
    copy(list1.begin(),list1.end(),out);
    cout<<endl;
    cout<<"第"<<k<<"大的数是: "<<endl;
    int count = 1;
    for(pos = list1.begin();pos!=list1.end();++pos,++count)
    {
        if(count==k)
           cout<<(*pos)<<endl;
    } 
    system("pause");
    return 0;
}
方法3:用最大堆排序
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
template<typename T>
void HeapAdjust(vector<T> &v,size_t start,size_t end)
{
    T tmp = v[start];
    size_t s = start;
    for(size_t j=(2*s+1);j<=end;j=(2*j+1))
    {
        if(j<end&&v[j+1]>v[j])
            j++;
        if(tmp<v[j])
        {
            v[s] = v[j];
            s = j;
        }
    }
    v[s] = tmp;
}
template<typename T>
void Swap(T &a,T &b)
{
    T tmp = a;
    a = b;
    b = tmp;
}
template<typename T>
void HeapSort(vector<T> &v)
{
    int i = 0,j=0;
    //建最大堆
    for(i=(v.size()-1)/2;i>=0;--i)
    {
        HeapAdjust(v,i,v.size()-1);
    }
    cout<<"输入K:"<<endl;
    int k;
    cin>>k;
    for(i=v.size(),j=k;i>1&&j>0;--i,--j)
    {
        Swap(v[0],v[i-1]);
        if(j==1)
        {
            cout<<v[i-1];
        }
        else
        {
            HeapAdjust(v,0,i-2); 
        }
    }
}
int main()
{
    int data[]={93,5,233,55,3,67,2,67,32,6,89,355};
    int len = sizeof(data)/sizeof(int);
    vector<int> v1(data,data+len);
    HeapSort(v1);
    return 0;
本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/03/31/1131862.html,如需转载请自行联系原作者
你可能感兴趣的文章
详测 Generics Collections TList (7): Items、Contains
查看>>
配置FTP服务器(2) 本地用户下载和上传
查看>>
多线程编程(11) - 多线程同步之 Mutex (互斥对象)[续]
查看>>
【Java每日一题】20161214
查看>>
requireJs 模块化简陋版本
查看>>
我的友情链接
查看>>
How to upgrade vim to version 8 on CentOS 7
查看>>
xcode pod 报import 找不到 pods的支持问题解决方法之一
查看>>
nginx配置让任何文件在浏览器中显示文本text/plain
查看>>
思科路由器×××配置-- 动态 site-to-site ×××(上)
查看>>
Visual Studio统计有效代码行数
查看>>
Qt连接Oracle数据库常见问题
查看>>
45个实用的JavaScript技巧、窍门和最佳实践
查看>>
sqlserver 2005 列字符串拼接
查看>>
用面向接口编程思想看找对象
查看>>
TWaver GIS在电信中的使用
查看>>
MySQL5.7使用Notifier启动、停止服务时出现的问题
查看>>
今天用java弄个json数据交换接口,个人感觉这样实现省事实力。
查看>>
5 Servlet
查看>>
百度创始人李彦宏:要做最好的中文搜索引擎
查看>>