2011-07-18 102 views
0

萬個號碼數組這是一個面試問題&我期待西隧專家可以以更好的方式回答...排序包含在Java中

你如何排序包含在Java中萬個號碼的陣列?

謝謝!

+2

告訴我你的答案,我會告訴你我的。 – PengOne

+1

可能是'Arrays.sort(Object [])':[Java Doc For Arrays](http://download.oracle.com/javase/6/docs/api/java/util/Arrays.html#sort(java .lang.Object []) –

+0

我提到關於使用循環排序,但我不知道...但面試官並不期望這個答案 – Mike

回答

4

面試的問題永遠沒有正確的答案。 面試官教導要問開放式問題,看看你如何思考和解決問題。 你反過來應該展示思考過程,並展示你可以用「軟件工程方式」思考。

類似的東西:

  1. 哦...... 1萬個號碼...
  2. 我認爲他們是簡單的長,所以百萬約需4兆內存
  3. (嗯.. 。可能是我在這裏是錯誤的,長的會佔用8個字節,所以它會是8M字節...... - 對於這個問題,現在並不那麼重要)。 (我確實知道我的工具和核心庫)。我們可以將它加載到內存並使用就緒算法Arrays.sort(long [])
  4. (我知道我的工具和核心庫)。
  5. 它不會有額外的內存和O(n * log(n))的複雜度(6 000 000次操作順便說一句)。
  6. 你能做得更快嗎?
  7. 噢......我記得我聽說過基數排序 - 那個算法給了我們o(k * n)的複雜度,其中k是有效數字的個數(長整數將是整數的兩倍(20億= 9位數)= 18位),所以它會是18 * 1百萬=哦......它會慢3倍,我不確定算法需要多少附加內存。
  8. 如果我們有這麼多的數據,它會溢出可用內存?
  9. 我們將砍數據轉換成的M L塊大小,以便每個塊中的將裝配到存儲器
  10. 我們將每個組塊separatedly排序並存儲結果到文件
  11. 合併的排序的文件將是與鄰(米)速度
  12. 而且,我們將需要執行L-1這樣合併
0

使用JVM的「專家」」的方式:

Arrays.sort(numberArray); 
+0

面試官對此答案不滿意... – Mike

+0

爲什麼不呢?這是這個問題最簡單的答案。 –

0

,因爲它是整數,有一百萬個 - 基數排序,就地,並在儘可能多的線程,因爲有可用的

0

的CPU 在數組中存儲數百萬的數據不是好主意。它可能會導致MemoryOutOfBounds異常。它會導致性能問題。 但是,如果要排序的數組

int[] intArray = new int[] {4, 1, 3, -23}; 
Arrays.sort(intArray); 
// [-23, 1, 3, 4] 

String[] strArray = new String[] {"z", "a", "C"}; 
Arrays.sort(strArray); 
// [C, a, z] 

// Case-insensitive sort 
Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER); 
// [a, C, z] 

// Reverse-order sort 
Arrays.sort(strArray, Collections.reverseOrder()); 
// [z, a, C] 

// Case-insensitive reverse-order sort 
Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER); 
Collections.reverse(Arrays.asList(strArray)); 
// [z, C, a] 
0

如果數字在1百萬有限範圍使用布爾數組。這將把記憶力降到125MB。使用索引作爲數字和值爲true或false。取消現有數組,並將其填充爲通過布爾數組讀取。

0

我們可以將條目放在一個NavigableHashMap中,以保持排序後的數據。因此,在放置密鑰時檢查是否存在密鑰,然後將值增加1.現在提取值的數據打印鍵倍數。只是在這種情況下,我們剛剛運行過O(N)的Array。