C++ Exercises(十)

寻找第K大数的三种方法
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

1.1 找出第K大的数

方法1

None.gif#include<iostream>
None.gif#include
<vector>
None.gif#include
<algorithm>
None.gif#include
<iterator>
None.gif
usingnamespacestd;
None.gif
None.gif
intmain()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif
intdata[]=dot.gif{3,54,254,52,13,667,234,67,256,78,467,32,65,324,889,34,5};
InBlock.gif
intlen=sizeof(data)/sizeof(int);
InBlock.gifvector
<int>v1(data,data+len);
InBlock.gifostream_iterator
<int>out(cout,"");
InBlock.gifcopy(v1.begin(),v1.end(),
out);
InBlock.gifcout
<<endl;
InBlock.gifsort(v1.begin(),v1.end(),greater
<int>());
InBlock.gifcopy(v1.begin(),v1.end(),
out);
InBlock.gifcout
<<endl;
InBlock.gif
intk;
InBlock.gifcin
>>k;
InBlock.gifcout
<<v1[k-1]<<endl;
InBlock.gifsystem(
"pause");
InBlock.gif
return0;
ExpandedBlockEnd.gif}

None.gif

方法2


None.gif#include
<iostream>
None.gif#include
<list>
None.gif#include
<algorithm>
None.gif#include
<iterator>
None.gif
usingnamespacestd;
None.gif
None.gif
classLessThan
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
public:
ExpandedSubBlockStart.gifContractedSubBlock.gifLessThan(
intval):value(val)dot.gif{}
ExpandedSubBlockStart.gifContractedSubBlock.gif
~LessThan()dot.gif{}
InBlock.gif
booloperator()(intrhs)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
returnrhs<=value;
ExpandedSubBlockEnd.gif}

InBlock.gif
private:
InBlock.gif
intvalue;
ExpandedBlockEnd.gif}
;
None.gif
intmain()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif
intdata[]=dot.gif{3,54,254,52,475,667,234,67,256,78,467,32,65,324,889,34,5};
InBlock.gif
intlen=sizeof(data)/sizeof(int);
InBlock.gif
intk;
InBlock.gifcin
>>k;
InBlock.giflist
<int>list1(data,data+k);
InBlock.gifostream_iterator
<int>out(cout,"");
InBlock.giflist1.sort(greater
<int>());//对前K个数进行排序
InBlock.gif
list<int>::iteratorpos;
InBlock.gif
for(inti=k;i<len;++i)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
if(data[i]>list1.back())
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{//比最后一个元素大
InBlock.gif
pos=find_if(list1.begin(),list1.end(),LessThan(data[i]));//找到第一个比要插入值小的元素位置
InBlock.gif
list1.insert(pos,data[i]);//插入新值
InBlock.gif
list1.pop_back();//删除最后一个多余的元素
ExpandedSubBlockEnd.gif
}

ExpandedSubBlockEnd.gif}

InBlock.gifcopy(list1.begin(),list1.end(),
out);
InBlock.gifcout
<<endl;
InBlock.gifcout
<<""<<k<<"大的数是:"<<endl;
InBlock.gif
intcount=1;
InBlock.gif
for(pos=list1.begin();pos!=list1.end();++pos,++count)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
if(count==k)
InBlock.gifcout
<<(*pos)<<endl;
ExpandedSubBlockEnd.gif}

InBlock.gifsystem(
"pause");
InBlock.gif
return0;
ExpandedBlockEnd.gif}

None.gif
None.gif

方法3:用最大堆排序

None.gif#include<iostream>
None.gif#include
<vector>
None.gif#include
<algorithm>
None.gif#include
<iterator>
None.gif
usingnamespacestd;
None.gif
None.giftemplate
<typenameT>
None.gif
voidHeapAdjust(vector<T>&v,size_tstart,size_tend)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gifTtmp
=v[start];
InBlock.gifsize_ts
=start;
InBlock.gif
for(size_tj=(2*s+1);j<=end;j=(2*j+1))
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
if(j<end&&v[j+1]>v[j])
InBlock.gifj
++;
InBlock.gif
if(tmp<v[j])
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifv[s]
=v[j];
InBlock.gifs
=j;
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

InBlock.gifv[s]
=tmp;
ExpandedBlockEnd.gif}

None.giftemplate
<typenameT>
None.gif
voidSwap(T&a,T&b)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gifTtmp
=a;
InBlock.gifa
=b;
InBlock.gifb
=tmp;
ExpandedBlockEnd.gif}

None.giftemplate
<typenameT>
None.gif
voidHeapSort(vector<T>&v)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
inti=0,j=0;
InBlock.gif
//建最大堆
InBlock.gif
for(i=(v.size()-1)/2;i>=0;--i)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifHeapAdjust(v,i,v.size()
-1);
ExpandedSubBlockEnd.gif}

InBlock.gifcout
<<"输入K:"<<endl;
InBlock.gif
intk;
InBlock.gifcin
>>k;
InBlock.gif
for(i=v.size(),j=k;i>1&&j>0;--i,--j)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifSwap(v[
0],v[i-1]);
InBlock.gif
if(j==1)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifcout
<<v[i-1];
ExpandedSubBlockEnd.gif}

InBlock.gif
else
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifHeapAdjust(v,
0,i-2);
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

ExpandedBlockEnd.gif}

None.gif
intmain()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif
intdata[]=dot.gif{93,5,233,55,3,67,2,67,32,6,89,355};
InBlock.gif
intlen=sizeof(data)/sizeof(int);
InBlock.gifvector
<int>v1(data,data+len);
InBlock.gifHeapSort(v1);
InBlock.gif
return0;
ExpandedBlockEnd.gif}

None.gif
None.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值