<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>
usingnamespacestd;

intmain()


{

intdata[]=
{3,54,254,52,13,667,234,67,256,78,467,32,65,324,889,34,5};
intlen=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;
intk;
cin>>k;
cout<<v1[k-1]<<endl;
system("pause");
return0;
}
#include<iostream>
#include<list>
#include<algorithm>
#include<iterator>
usingnamespacestd;

classLessThan


{
public:

LessThan(intval):value(val)
{}

~LessThan()
{}
booloperator()(intrhs)


{
returnrhs<=value;
}
private:
intvalue;
};
intmain()


{

intdata[]=
{3,54,254,52,475,667,234,67,256,78,467,32,65,324,889,34,5};
intlen=sizeof(data)/sizeof(int);
intk;
cin>>k;
list<int>list1(data,data+k);
ostream_iterator<int>out(cout,"");
list1.sort(greater<int>());//对前K个数进行排序
list<int>::iteratorpos;
for(inti=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;
intcount=1;
for(pos=list1.begin();pos!=list1.end();++pos,++count)


{
if(count==k)
cout<<(*pos)<<endl;
}
system("pause");
return0;
}

#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>
usingnamespacestd;

template<typenameT>
voidHeapAdjust(vector<T>&v,size_tstart,size_tend)


{
Ttmp=v[start];
size_ts=start;
for(size_tj=(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<typenameT>
voidSwap(T&a,T&b)


{
Ttmp=a;
a=b;
b=tmp;
}
template<typenameT>
voidHeapSort(vector<T>&v)


{
inti=0,j=0;
//建最大堆
for(i=(v.size()-1)/2;i>=0;--i)


{
HeapAdjust(v,i,v.size()-1);
}
cout<<"输入K:"<<endl;
intk;
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);
}
}
}
intmain()


{

intdata[]=
{93,5,233,55,3,67,2,67,32,6,89,355};
intlen=sizeof(data)/sizeof(int);
vector<int>v1(data,data+len);
HeapSort(v1);
return0;
}

1.1 找出第K大的数
方法1:
#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>
usingnamespacestd;
intmain()

{
intdata[]=
{3,54,254,52,13,667,234,67,256,78,467,32,65,324,889,34,5};
intlen=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;
intk;
cin>>k;
cout<<v1[k-1]<<endl;
system("pause");
return0;
}
方法2:
#include<iostream>
#include<list>
#include<algorithm>
#include<iterator>
usingnamespacestd;
classLessThan

{
public:
LessThan(intval):value(val)
{}
~LessThan()
{}
booloperator()(intrhs)

{
returnrhs<=value;
}
private:
intvalue;
};
intmain()

{
intdata[]=
{3,54,254,52,475,667,234,67,256,78,467,32,65,324,889,34,5};
intlen=sizeof(data)/sizeof(int);
intk;
cin>>k;
list<int>list1(data,data+k);
ostream_iterator<int>out(cout,"");
list1.sort(greater<int>());//对前K个数进行排序
list<int>::iteratorpos;
for(inti=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;
intcount=1;
for(pos=list1.begin();pos!=list1.end();++pos,++count)

{
if(count==k)
cout<<(*pos)<<endl;
}
system("pause");
return0;
}
方法3:用最大堆排序
#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>
usingnamespacestd;
template<typenameT>
voidHeapAdjust(vector<T>&v,size_tstart,size_tend)

{
Ttmp=v[start];
size_ts=start;
for(size_tj=(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<typenameT>
voidSwap(T&a,T&b)

{
Ttmp=a;
a=b;
b=tmp;
}
template<typenameT>
voidHeapSort(vector<T>&v)

{
inti=0,j=0;
//建最大堆
for(i=(v.size()-1)/2;i>=0;--i)

{
HeapAdjust(v,i,v.size()-1);
}
cout<<"输入K:"<<endl;
intk;
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);
}
}
}
intmain()

{
intdata[]=
{93,5,233,55,3,67,2,67,32,6,89,355};
intlen=sizeof(data)/sizeof(int);
vector<int>v1(data,data+len);
HeapSort(v1);
return0;
}
寻找第K大数的三种方法
8754

被折叠的 条评论
为什么被折叠?



