從M個數中選擇前N大的數

2021-06-07 09:36:16 字數 536 閱讀 9642

如果對m個數字全排列,

1 用簡單排序演算法,例如氣泡排序,時間複雜度m*m

2 用快速排序 最壞時間複雜度度蛻化為m*m

堆排序歸併排序

平均時間負責度為m*logm

此處,需要選擇前n大的數,用氣泡排序,迴圈次數為n,時間複雜度為m*n

如果是海量資料呢?

筆試時經常碰到這樣類似的題目:

從100w個數中找出前100個數

演算法如下:根據快速排序劃分的思想

(1) 先對所有資料分成[a,b)b(b,d]兩個區間,(b,d]區間內的數都是大於[a,b)區間內的數

(2) 對(b,d]重複(1)操作,直到最右邊的區間個數小於100個。注意[a,b)區間不用劃分

(3) 向左邊的第乙個區間取前100-n.n為已取出的元素個數。方法仍然是對其劃分,取[c,d]區間。如果個數不夠,繼續(3)操作

(4) 有必要的話,對取出的100個數進行快速排序。over~

sunny總結:此方法利用的是快速排序的思想

時間複雜度很明顯小於m*logm

從m個數中選擇n個數的實現

從m個數中選出n個數來 0 n m 要求n個數之間不能有重複,其和等於乙個定值k。求一段程式,羅列所有的可能。例如備選的數字是 11,18,12,1,2,20,8,10,7,6 和k等於 18 那麼組合的可能有 18 8,10 2,20 12,6 11,7 11,1,6 1,10,7 12,2,8 ...

從n個數中選擇k個數

這是組合問題,組合問題有幾種寫法,且時間複雜度位o n 2 1 暴力迴圈,適用於固定的k 比方從7個數中找兩個數 int main sort nums.begin nums.end int count 0 for int i 0 i nums.size i cout count 2 當前數選不選,遞...

輸出從n個數中選m個數的所有組合

題目 n個數1,2,n,從這n個數中任意選m個數,輸出所有不同組合,共有c n,m 種不同組合。如n 5,m 3,會產生如下輸出 5 4 3 5 4 2 5 4 1 5 3 2 5 3 1 5 2 1 4 3 2 4 3 1 4 2 1 3 2 1 解題思路1 採用遞迴的方法,終止條件是當m 0時,...