1億個int數從小到大排序列出第1萬到第10萬個數

2021-05-23 14:49:13 字數 861 閱讀 9171

1億個int數從小到大排序列出第1萬到第10萬個數

這是某天師弟提出的乙個面試題,本來還算是比較簡單的,但是太久脫離演算法,讓我頓時沒有乙個更好的解決方案,於是被人用桶排序直接鄙視了一下。當時因為沒提出乙個很好的解決方案,還是落敗了,只能說桶排序的效率還是滿高的。但是我深知,這題肯定不能就這麼排序解決。後來由於工作的原因,也把這事給淡忘了。今天無意翻起當時的草稿,遂想起應該用分段的做法。當時也有某師兄提過,但是他沒有描述過程,於是被人遺忘。

先分析這題的做法如果用桶排序的方式,需要用o(nm)的時間複雜度,寫成鍊錶最少需要o(n)的空間輔助。

這裡是一億個int數,所以我們假設不考慮記憶體空間,直接用桶存,要用個2^32的時間和空間應該是最好的情況了

但是其實這道題的精髓部分在於列出第1萬到第10萬個數,直覺告訴我如果你把他全部都排一遍的話,那麼可能直接被刷了。

後來想到分段的方式,先用1w的輔助空間,用o(n)的時間,這裡的n = 1億挑出前1w個數。(這1w空間可以標記資料的位置)

再用9w的輔助空間,o(n)的時間,挑出1w-10w的數。現在隨便用個歸併排序、堆排序什麼的,可以在o(n*logn)時間內計算出來,這裡的n = 9w。這樣算出來的全程時間算成具體單位時間是2億多一點。輔助空間最好情況為10w,具體根據9w個數排序方式。

這樣算下來,時間上比直接桶排序是要快一倍,輔助空間上就要小太多了。

補充,後來在別人的提醒下,想到其實可以用o(n)的時間 (n = 1億) 直接挑出前10w的數,然後再將10w數排序,時間複雜度為:o(n*logn) 這裡n = 10w,然後再用o(n)挑出前1w個數,最後得到的便是解。

時間複雜度在1億多一點

空間複雜度在10w左右

從小到大排序1(for迴圈法)

輸入n,下一行有n個數,將這n個數從小到大排序 難度 中等難度 知識點 排序 for 陣列,swap swap a,b 函式 交換a,b a,b必須是int double long long型別,字串不行!如下 include include using namespace std int main...

C 把乙個int陣列的數字從小到大排列

using system class class1 int last mtm.mtm array int n 0 for int i 0 i array.length i system.console.writeline n總共個數字 n system.console.readline todo 在...

64 指標 10個數從小到大排列 cpp

作 者 解曉東 完成日期 2012 年 10 月 27 日 版 本 號 v1.0 輸入描述 問題描述 運用指標把10個整數按從小到大的順序輸出 程式輸出 問題分析 演算法設計 include using namespace std int main cout cout the sorted arra...