陣列中前k大的數

2021-08-31 10:52:39 字數 790 閱讀 1794

問題:《程式設計之美》page139.尋找最大的k個數。

方法一:通過全排序(快速排序),然後獲取前k個數即位最大的k個數。演算法複雜度:o(nlogn).

方法二:通過部分排序。(選擇排序,氣泡排序),直接獲取前k個最大的數。演算法複雜度o(n*k).當k比較小的時候可以考慮

方法三:快速排序的變種。前面尋找陣列中第k大數的過程中,當找準陣列中第k大數的位置時,陣列中比k大的資料都在k的left邊,比k小的資料都在k的right邊。從而獲取前k大的資料。其實也是部分排序。演算法複雜度:o(n).

public class findkth ;

int k=4;

find(array,0,array.length-1,k-1);

}public static void find(int array,int left, int right,int k)

int i=left;

int j=right+1;

int key=array[left];

while(true)while(i<=right&&array[i]>key);

dowhile(j>=left&&array[j]執行結果:

the 4th max number is:3

find numbers are: 

7 4 4 3 

方法四:如果n很大,比如100億。可以採用乙個陣列,陣列中始終保持訪問過的所有的數中的前k個最大的資料,每次從k個數中淘汰掉最小的數,到最後可以一次遍歷獲取前k個最大的資料。通過維持乙個容量為k的最小堆的方式來實現。演算法複雜度o(n*log2k)

前k大的數

取前 k 個數,並取出最小值 mi k min k,n 遍歷 第 k 1 n的數,與 mi k 比較。若小於 mi k 遍歷下乙個。若大於 mi k 放入該值,並移除mi k 後,再次取出最小值 mi k min k,n 時間複雜度 o n k 1.將資料分成三個區間 1 k 1,k m,m 1 n...

第k大的數,前k大的數

1 排序後去出前k個,o n log n 如果k2 o nlog k 快排把數分為了兩個部分,所以考慮兩個情況,如果大的部分的個數 k,說明只要繼續在大的部分找就可以了,如果大的部分的個數3 o nlog maxv minv delta 平均為o nlogn 轉化為找第k個,假設最大的數為maxv,...

尋找前k大的數

input 輸入有多個測試用例,每個測試用例是兩行 第1行是兩個整數n和k,中間用空格隔開 n k 第2行有n個整數,每兩個數字中間用空格隔開 輸入以eof結束 output 對於每乙個測試用例,輸出一行,k個整數,就是它的前k大的整數,按照降序排列輸出,每兩個數字之間用空格隔開,最後乙個數字後面沒...