嗨,我試圖根據數組中值的出現次數對數組進行排序。因此,如果我的數組int[] a = new int[]{9,2,4,8,9,4,3,2,8,1,2,7,2,5};
我的數組計數應該是:count [i-1]並基於數組的值我的計數數組看起來像這樣:1 4 1 2 1 0 1 2 2
因此count[0] = 1
存儲計數爲1 count[1] =4
並存儲計數爲2,count[2] = 1
將計數存儲爲3,並且count[8] =2
存儲9的出現次數。我的計數應該是count[i-1]
,以存儲出現次數,並根據我應對數組進行排序的次數。第一個問題,我無法將數組a的出現次數存儲到count數組中。並根據出現的次數,我如何去存儲數組。根據出現次數對數組進行排序
回答
第一步是通過你的數組,存儲每個數字出現的次數。假設數組可包含的元素只能從1
到k
,所以我們需要一個count
陣列可以存儲k
元素:
int k = 9;
int[] count = new int[k];
請注意,此數組將在各位置的默認值0
,這需要O(k)
初始化時間和空間做的,所以它是等價的:
int[] count = {0, 0, 0, 0, 0, 0, 0, 0, 0};
因此,最初的計數0
所有元素。
現在我們計算數組中的元素。
例如:
int[] a = new int[]{9,2,4,8,9,4,3,2,8,1,2,7,2,5};
// Go through each element of this array:
int n = a.length
for (int i = 0; i < n; i++) {
// Add 1 to the corresponding position in the count array.
int position = a[i] - 1;
count[position]++;
}
這需要O(n)
時間,並會導致:
count = {1, 4, 1, 2, 1, 0, 1, 2, 2}
我們做到了這一點後,數組實際上是排序。我們可以看到這是真的這樣做:
int[] sorted = new int[n];
int h = 0;
for (int i = 0; i < count.length; i++) {
for (int j = 0; j < count[i]; j++) {
// Sum 1 to i to get the original number
sorted[h++] = i + 1;
}
}
System.out.println(Arrays.toString(sorted));
這也需要O(n)
時間和空間,輸出:
[1, 2, 2, 2, 2, 3, 4, 4, 5, 7, 8, 8, 9, 9]
所以這個算法總時間和空間複雜度爲O(n + k)
,這意味着它項目數量加上最大和最小鍵值之間的差異線性運行。
這個排序算法可以優化嗎? – 2015-04-03 09:11:15
我不這麼認爲,因爲它已經是'O(n + k)'。我更新了答案以表明這一點。 – 2015-04-03 14:51:36
我明白了。非常感謝。 – 2015-04-04 06:31:34
- 1. 根據出現次數對數組進行升序排序
- 2. 根據常見詞的出現對csv數據進行排序
- 3. 如何根據出現的UNIX數量對行進行排序?
- 4. 如何根據出現次數對值進行分組
- 5. 如何根據鍵的出現次數對字典進行「排序」?
- 6. 根據另一個數組對數組進行排序,swift
- 7. 如何根據另一個數組對數組進行排序?
- 8. [Java]根據玩家分數對數組進行排序
- 9. 如何根據對象的屬性對數組進行排序?
- 10. Javascript:根據輸入的數字對數組進行排序。應該出現隨機排序
- 11. 對數組進行排序
- 12. 根據內部數組上的對象的屬性對數組進行排序
- 13. 對數組或數組進行排序?
- 14. 根據月份對數據庫結果對象(數組)進行排序
- 15. 根據日期對NSDictionary數組進行排序
- 16. 根據用戶輸入對數組列表進行排序?
- 17. PHP - 根據另一個陣列對數組進行排序
- 18. Laravel如何根據數組索引對集合進行排序
- 19. 如何根據列值對numpy數組進行排序?
- 20. 根據PHP中的日期對事件數組進行排序
- 21. 如何根據notif_date_sort對這個多維數組進行排序?
- 22. 用JavaScript對數組進行排序時出現錯誤
- 23. angular2實現管根據選擇的屬性數組對象進行排序
- 24. 3對已排序的數組進行排序。 O(NlogN)實現
- 25. 首先根據另一個數組對數組中的值進行排序
- 26. 如何根據Swift中的數組內容對字典數組進行排序
- 27. 如何根據一個數組對多個數組進行排序?
- 28. 按對象在該數組中出現的次數對數組排序
- 29. 如何根據數據行子串對VB.NET DataView進行排序?
- 30. 如何根據除數的數量對數組元素進行排序?
如果[i]的上限適度小於那麼我會建議計數排序 – 2015-04-03 06:15:57
到目前爲止,我只能看到要求。你實際執行它有什麼困難? – Stultuske 2015-04-03 06:17:57
@ZiadHalabi是的。這可能是解決方案。但我覺得這很複雜。簡單的計數就可以了。只是想一想 – 2015-04-03 06:18:16