《编程之美》2.5:寻找最大的K个数
下面的程序写的是寻找的最小的K个数,最大的K个数类似:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int quickSelect(int A[],int N)
{
swap(A[0],A[rand()%N]);
int k=1;
for(int i=1;i<N;i++)
{
if(A[i]<A[0])
swap(A[i],A[k++]);
}
swap(A[0],A[k-1]);
return k-1;
}
void quickSearch(int A[],int N,int k,vector<int> &result)
{
int m=quickSelect(A,N);
if(m==k)
{
for(int i=0;i<k;i++)
result.push_back(A[i]);
return ;
}
else if(m>k)
quickSearch(A,m,k,result);
else
{
for(int i=0;i<=m;i++)
result.push_back(A[i]);
quickSearch(A+m+1,N-m-1,k-m-1,result);
}
}
void bitSearch(int A[],int N,int k,vector<int> &result)
{
int x=0;
int last=N;//last前面的数总是比last后面的数要小,
for(int i=31;i>=0;i--)
{
int m=x;
for(int j=x;j<last;j++)
{
if((A[j]&(1<<i))==0)
swap(A[j],A[m++]);
}
if(m-1==k)
break;
if(m-1>k)//表示前m个数中已经包含了k个最小的数
{
x=0;
last=m;
}
else//表示前m个最小的数比k少,需要从m到N中再取
x=m;
}
for(int i=0;i<k;i++)
result.push_back(A[i]);
}
void heapSearch(int A[],int N,int k,vector<int> &result)
{
for(int i=0;i<k;i++)
result.push_back(A[i]);
make_heap(result.begin(),result.begin()+k);
for(int i=k;i<N;i++)
{
if(A[i]<result.front())
{
result.push_back(A[i]);
push_heap(result.begin(),result.end());
pop_heap(result.begin(),result.end());
result.pop_back();
}
}
}
vector<int> searchTheKElement(int* A,int N,int k,int algorithm)
{
vector<int> result;
if(k>=N)
return result;
switch(algorithm)
{
case 0:
quickSearch(A,N,k,result);
break;
case 1:
bitSearch(A,N,k,result);
break;
case 2:
heapSearch(A,N,k,result);
break;
default:
break;
}
return result;
}
int main()
{
const int N=100;
int A[N];
generate(A,A+N,rand);
int k=20;
enum {quickSearch,bitSearch,heapSearch};
vector<int> result1=searchTheKElement(A,N,k,heapSearch);
vector<int> result2=searchTheKElement(A,N,k,bitSearch);
vector<int> result3=searchTheKElement(A,N,k,quickSearch);
system("pause");
return 0;
}