C++ Exercises(十)
来源:互联网 发布:mysql比较符转移函数 编辑:程序博客网 时间:2024/05/20 05:57
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;
}
#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;
}
#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;
}
- C++ Exercises(十)
- C++ Exercises(二十)
- Accelerated C++Exercises' Resolutions
- c++primer exercises 2.9
- c++primer exercises 7.0
- C++ Exercises(十九)
- C++ Exercises(十八)
- C++ Exercises(十四)
- C++ Exercises(十三)
- C++ Exercises(十二)
- C++ Exercises(十一)
- C++ Exercises(九)
- C++ Exercises(八)
- C++ Exercises(七)
- C++ Exercises(六)
- C++ Exercises(八)
- C++ Exercises(七)
- C++ Exercises(六)
- 【转】基于 Mozilla 的扩展开发
- 对Skin++在VS2005中的一个问题的解决方案
- 【译】光线跟踪:理论与实现(二)Phong模型,镜面反射及阴影
- 【译】光线跟踪:理论与实现(一) 简介
- 对“最大子序列和问题”的一点思考
- C++ Exercises(十)
- 【转】VC 常用插件和界面库
- C++ Exercises(九)
- 自绘制带图标的菜单项
- 【转】VS2005无法启动调试的解决方案
- VC++线程通信
- TinyXML:一个优秀的C++ XML解析器
- 图像处理---黑白化
- Win32汇编学习笔记(四)