面試題30.最小的k個數

題目:輸入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 }

運行截圖:

相關文章
相關標籤/搜索