題目:輸入n個整數,找出其中最小的k個數,例如輸入4,5,1,6,2,7,3,8 這8個數字,則最小的四個數字爲1,2,3,4,ios
這道題是典型的TopK問題,劍指Offer提供了兩種方法來實現,一種方法是parition方法,一種數組
方法是創建一個大小爲k的堆進行topk求解spa
這裏咱們只解釋第一種方法:code
1.首先隨機查找數組中一個元素做爲一個基準,而後parition一次使得數組左邊的元素小於基本,數組右邊的元素大於基準。blog
2.此時將再將基準插入到數組適當的位置並返回該位置的索引。索引
3.若是索引index小於k-1則繼續在[index+1,end]範圍內進行parition,it
4.若是索引index大於k-1則繼續在[start,index-1]範圍內進行paritonio
5.直到index==k-1時候結束class
代碼實現以下:stream
1 #include <iostream> 2 using namespace std; 3 4 int Partiton(int array[],int start,int end) 5 { 6 int i=start; 7 int j=end; 8 int k=0; 9 int base=array[0]; 10 while(i<j) 11 { 12 if(i<j&&base<=array[j]) 13 j--; 14 15 if(i<j) 16 { 17 array[i]=array[j]; 18 i++; 19 } 20 21 if(i<j&&base>array[i]) 22 i++; 23 24 if(i<j) 25 { 26 array[j]=array[i]; 27 j--; 28 } 29 } 30 31 array[i]=base; 32 33 return i; 34 } 35 36 int FindTopK(int array[],int start,int end,int k) 37 { 38 int startindex=start; 39 int endindex=end; 40 int index=Partiton(array,startindex,endindex); 41 42 43 44 while(index!=k-1) 45 { 46 if(index>k-1) 47 { 48 endindex=index-1; 49 index=Partiton(array,startindex,endindex); 50 } 51 else 52 { 53 startindex=index+1; 54 index=Partiton(array,startindex,endindex); 55 } 56 } 57 return index; 58 } 59 60 61 int main() 62 { 63 int array[]={4,5,1,6,2,7,3,8}; 64 int len=8; 65 int Index; 66 int k=4; 67 Index=FindTopK(array,0,len-1,k); 68 69 cout<<"The Top K number is: "; 70 for(int i=0;i<Index+1;i++) 71 { 72 cout<<array[i]<<" "; 73 } 74 cout<<endl; 75 system("pause"); 76 return 0; 77 }
運行截圖: