編程之美——尋找數組中最大的K個數

從別人的那裏轉過來,這種題目,其實就是需要使用分治方法


編程之美上的尋找N個數中最大的前K數,給出了一種算法,我認爲比較好:

算法是這樣寫的:
    假設N個數存儲在數組S中,我們從數組S中隨機選出一個元素X,把數組分爲兩部分Sa和Sb.Sa中的元素都大於X,Sb中的元素都小於X,這時,有兩種可能性:
1.Sa中元素的個數小於K,Sa中所有的數和Sb中最大的K-|Sa|個數(|Sa|指Sa中元素的個數)就是數組S中最大的K個數。
2.Sa中元素的個數大於或等於K,則直接返回Sa中最大的K個元素。
平均時間複雜度O(N*log2 K)
 
 僞代碼如下:
Kbig(S,K)  
   if(k<=0):  
      return []  
   if(length S<=K):  
      return S  
   (Sa,Sb)=Partition(s)  
   return Kbig(Sa,k).Append(Kbig(Sb,k-length Sa)  
//////////////////////////////////////////////////  
Partition(S):  
    Sa=[];  
    Sb=[];  
    Swap(s[1],S[random()%length S])  
    p=S[1]  
    for i in [2:length S]:  
        s[i] > p ? Sa.Append(s[i]):Sb.Append(S[i])  
  
length Sa
return (Sa,Sb) 
 
本人實現的代碼:
 
// MicroSTest2.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include
#include
#include
#include
using namespace std;
vector  Append(vector & A , vector & B)
{
 if(B.size()<=0)
  return A;
 for(int i=0;i
  A.push_back(B[i]);
 return A;
}
pair , vector> PartitionFun(vector origin)
{
 srand((unsigned)time(NULL)); 
 vector Sa , Sb;
 pair , vector> res;
 int tmp1 = origin[0];
 int tmp2 = origin[rand()%origin.size()];
 origin[0] = tmp2;
 origin[rand()%origin.size()] = tmp1;
 int p = origin[0];
 for(int i=1;i
  origin[i]>p ? Sa.push_back(origin[i]) : Sb.push_back(origin[i]);
 Sa.size()
 res = make_pair(Sa,Sb);
 return res;
}
vector  Kbig(vector & S , int k)
{
 pair,vector > ret;
 vector sa,sb,tmp;
 if( k <= 0 )
  return S;
 if( k >=  S.size() )
  return S; 
 ret = PartitionFun(S);
 sa = ret.first;
 sb = ret.second;
 if(sa.size()>=k)
  return Kbig(sa,k);
 else{
  tmp = Kbig( sb , k-sa.size() );
  return Append(sa,tmp);
 }
}


int _tmain(int argc, _TCHAR* argv[])
{
 int A[] = {9,3,6,2,3,8,5,3,6,9,7,4,2,4,6,4,9,6,3,2};
 vector  myvect(A,A+sizeof(A)/sizeof(int));
// vector tmpvect(A+3,A+15);
// myvect = Append(myvect,tmpvect);
 cout<<"數組長度是 "<<myvect.size()<<endl;
 cout<<"數組最大長度是 "<<myvect.max_size()<<endl;
 cout<<"數組容量是 "<<myvect.capacity()<<endl;
 myvect.push_back(88);
 myvect.push_back(8);
 cout<<"數組長度是 "<<myvect.size()<<endl;
 cout<<"數組最大長度是 "<<myvect.max_size()<<endl;
 cout<<"數組容量是 "<<myvect.capacity()<<endl;
 
 //排序前
 for(int i=0;i
  cout<<myvect[i]<<"  ";
 cout<<endl;
 //對數組排序
// sort(myvect.begin() , myvect.end()); /// /小到大
// reverse(myvect.begin(),myvect.end()); /// 從大道小
 //排序後,對元素的修改


 for(int i=0;i
  cout<<myvect[i]<<"  ";
 cout<<endl<<"----------------------------"<<endl;
 vector  res = Kbig(myvect,6);
 for(int i=0;i
  cout<<res[i]<<"  ";
 cout<<endl;
   
 system("pause");
 return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章