從10000個整數中找出最大的10個,最好的算法是什么?
算法一:冒泡排序法
千里之行,始於足下。我們先不說最好,甚至不說好。我們只問,如何“從10000個整數中找出最大的10個”?我最先想到的是用冒泡排序的辦法:我們從頭到尾走10趟,自然會把最大的10個數找到。方法簡單,就不再這里寫代碼了。這個算法的復雜度是10N(N=10000)。
算法二:
有沒有更好一點的算法呢?當然。維持一個長度為10的降序數組,每一個從數組拿到的數字都與這個降序數組的最小值比較。如果小於最小值,就舍棄;如果大於最小值,就把它插入到降序數組中的合適位置,舍棄原來的最小值。這樣,遍歷一遍就可以找到最大的10個數。因為需要在降序數組中插入一個數,對於遍歷的每個數可能都需要這樣,所以其復雜為5N。
偽代碼如下:
A[N],a[m](分別為原始數組和降序數組,其中N=10000,m=10)
a = A[0 ... 9](將數組A的前10個數賦給數組a)
sort a(將組數a降序排序)
for i in A[ 10 ... N](從10到N遍歷數組A)
if A[i] > a[9] then (如果當前值比降序數組中的最小值大)
刪除a[9]
將A[i]插入a的合適位置,使a保持降序
end if
end for
輸出數組a
其實算法二還有一個優點,就是當數組很大時,可以將數據分段讀入內存處理,而這樣做並不影響結果。
你還有什么辦法?