5 查詢最小的k個元素

2021-06-04 08:19:28 字數 1279 閱讀 2507

題目

輸入n個整數,輸出其中最小的k個。

例如輸入1,2,3,4,5,6,7和8這8個數字,則最小的4個數字為1,2,3和4。

分析:

這道題最簡單的思路莫過於把輸入的n個整數排序,這樣排在最前面的k個數就是最小的k個數。只是這種思路的時間複雜度為o(nlogn)。我們試著尋找更快的解決思路。 

我們可以開闢乙個長度為k的陣列。每次從輸入的n個整數中讀入乙個數。如果陣列中已經插入的元素少於k個,則將讀入的整數直接放到陣列中。否則長度為k的陣列已經滿了,不能再往陣列裡插入元素,只能替換了。如果讀入的這個整數比陣列中已有k個整數的最大值要小,則用讀入的這個整數替換這個最大值;如果讀入的整數比陣列中已有k個整數的最大值還要大,則讀入的這個整數不可能是最小的k個整數之一,拋棄這個整數。這種思路相當於只要排序k個整數,因此時間複雜可以降到o(n+nlogk)。通常情況下k要遠小於n,所以這種辦法要優於前面的思路。 

這是我能夠想出來的最快的解決方案。不過從給面試官留下更好印象的角度出發,我們可以進一步把**寫得更漂亮一些。從上面的分析,當長度為k的陣列已經滿了之後,如果需要替換,每次替換的都是陣列中的最大值。在常用的資料結構中,能夠在o(1)時間裡得到最大值的資料結構為最大堆。因此我們可以用堆(heap)來代替陣列。 

**如下:

#include int a[20],k,n;

void inputnum(); //首先輸入k個數,並將其生成最大堆

void shift(int front);//從下標為front開始向下調整堆

void fun(); //輸入剩下的數,如果比堆中最大數還要大,插入,並調整

void output(); //輸出最小的k個數

int main()

void inputnum()

}void shift(int front)

if (temp>a[rear])

a[front]=a[rear];

front=rear;

rear=2*front+1;

} a[front]=temp;

}void fun()

{ int i,num;

for (i=k;i

查詢最小的k個元素

題目 輸入n個整數,輸出其中最小的k個。演算法思想,要是將n個數排序然後輸出前k個,方法很簡單,但計算量比較大,為o nlogn 要是新建乙個有k個元素陣列,在陣列不滿時,將每乙個輸入的資料存入陣列。若陣列滿了,則比較輸入的資料與陣列中最大元素的大小,來決定接下來幹什麼,接下來幹什麼,我語言表達能力...

查詢最小的k個元素

查詢最小的k個元素 題目 輸入n個整數,輸出其中最小的k個。例如輸入1,2,3,4,5,6,7和8這8個數字,則最小的4個數字為1,2,3和4。1 輸入元素,並排序 2 輸出前k個元素 排序 採用高效的排序方法,如 快速排序,歸併排序等 方法一 採用最簡單的方法 include include in...

查詢最小的k個元素

題目 輸入n個整數,輸出其中最小的k個數 例如 1 2 3 4 5 6 7 8 這8個數字,則最小的4個數字為1,2,3,4,第一種 直接對其先排序,再取頭幾個數 這樣最快是nlogn 快排或者堆排 include using namespace std void partsort int a,in...