尋找最小的k個數

2021-06-27 10:00:54 字數 597 閱讀 5209

尋找最小的k個數

在乙個長度為n的陣列中,尋找最小的k個數。(最大的k個數解法類似)

想法比較簡單,先對n個數排序,再輸入前面k個數,即可。

這種方法的時間複雜度比較大。假設我們使用快排,需要o(nlogn), 然後輸出k個數需要o(k),一共要o(nlogn)~

**略。

這種方法比較好,演算法簡單,易於實現。

先把陣列中的前k個數作為候選最小塊;再讓這個塊往後移,每移動一次就比較當前數和塊中的最大數,如果比最大數小,替換掉,重新選擇乙個塊中的最大數。

如下圖所示:

這種方法的時間複雜度為o(k)+o(n-k)k=o(nk).

還有一種改進的方法,就是把k個數放在乙個最大堆heap中,然後每次移動更新的時候,就是乙個更新堆的過程,如果當前數比堆頂元素(k個數中的最大數)小,那麼我們就更新這個堆。而更新堆只需要o(logk)。所以這種改進方法的時間複雜度為o(nlogk)。

這種方法的比較難懂,不過時間複雜度為o(n).

尋找最小的k個數

輸入n個整數,輸出其中最小的k個。要求乙個序列中最小的k個數,按照慣有的思維方式,則是先對這個序列從小到大排序,然後輸出前面的最小的k個數。至於選取什麼的排序方法,我想你可能會第一時間想到快速排序 我們知道,快速排序平均所費時間為n logn 然後再遍歷序列中前k個元素輸出即可。因此,總的時間複雜度...

尋找最小的 k 個數

輸入n個整數,輸出其中最小的k個。使用排序的方法來解決該問題。快速排序所費時間複雜度為o n logn 排序完成過後,只需要取前k個數值即是最小的k個數。int array const int length sizeof array sizeof array 0 void printarray in...

尋找最小的k個數

輸入n個整數,輸出其中最小的k個。要求乙個序列中最小的k個數,按照慣有的思維方式,則是先對這個序列從小到大排序,然後輸出前面的最小的k個數。至於選取什麼的排序方法,我想你可能會第一時間想到快速排序 我們知道,快速排序平均所費時間為n logn 然後再遍歷序列中前k個元素輸出即可。因此,總的時間複雜度...