尋找最小k個數或者尋找第K大的數字

2021-07-04 23:46:19 字數 849 閱讀 6019

輸入n個整數,找出最小的前k個數字(或者第k大的數字),例如輸入4,5,1,6,2,7,3,8這八個數,則輸出最小4個數是1,2,3,4.

o(n)解法,需要修改輸入陣列。

可以採用快速排序partition函式來解決這個問題。快排的partition函式所完成的功能是將小於pivot的數放在partiton函式返回值的左邊,大於pivot的數放在partiton函式的右邊,一趟劃分的時間複雜度是o(n).因此我們可以基於partition函式的這種功能,判斷每次返回值與k的大小來調整partition的位置。

#include 

using namespace std;

void exchange(int &a, int &b)

int partition(int* num, int start, int end)

exchange(num[++i], num[end]);

return i;

}int main()

else

}for (int i = 0; i < k; i++)

cout << num[i] << " ";

}

o(nlgk),適合大資料儲存,不需要修改輸入資料。

維護乙個大小為k的容器來儲存目前已知的最小k個數,每次從資料中讀入乙個數,如果容器內個數小於k,則直接插入。若容器內個數大於k,則將容器內最大的數與當前數比較,若最大數大於當前數,則將最大數從容器中刪除,將當前數插入容器;否則丟棄當前數。

因為容器需要每次返回乙個最大值,所以自然想到用stl的priority_queue來是實現當前容器,每次可以在o(1)的時間獲得最大值,但需要o(lgk)的時間來完成插入和刪除操作。

尋找最小的k個數

尋找最小的k個數 在乙個長度為n的陣列中,尋找最小的k個數。最大的k個數解法類似 想法比較簡單,先對n個數排序,再輸入前面k個數,即可。這種方法的時間複雜度比較大。假設我們使用快排,需要o nlogn 然後輸出k個數需要o k 一共要o nlogn 略。這種方法比較好,演算法簡單,易於實現。先把陣列...

尋找最小的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...