(算法)從10000個數中找出最大的10個


  從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

  其實算法二還有一個優點,就是當數組很大時,可以將數據分段讀入內存處理,而這樣做並不影響結果。

  你還有什么辦法?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM