這裏是傳送門⇒總結:關於排序算法html
平均時間複雜度 | 最優時間複雜度 | 最差時間複雜度 | 空間複雜度 | 穩定性 | |
---|---|---|---|---|---|
計數排序 | O(n+m) | O(n+m) | O(n+m) | O(n+max) | 穩定 |
優化後 | O(n+m) | O(n+m) | O(n+m) | O(n+m) | 穩定 |
計數排序一種是「空間換時間」的排序,只能直接應用於非負整數的排序中(由於數組下標是非負整數,至關於用待排元素i做爲索引,數組元素的值count[i]是待排序列中小於或者等於該下標i的元素數量)。算法
優點在對於元素取值範圍m較小的待排序列的排序中,(優化後)時間複雜度是線性的Ο(n+m),快於任何鍵值比較排序算法。固然若是O(m)>O(nlogn)
,其效率反而不如基於鍵值比較的排序,若數據範圍m比排序數據的數量n大不少,就不適合用計數排序。數組
雖然算法中有比較,但並不是是鍵值間的比較,而是經過對元素值的計數和計數值的累加來肯定的。優化
// 此處沒有改變array function CountingSort(array) { var len = array.length; if (len <= 1) { return array; } var max = array[0]; var count = [], res = []; for (var i = 1; i < len; i++) { if (array[i] > max) { max = array[i]; } } var countLen = max + 1; for (var i = 0; i < countLen; i++) { count[i] = 0; } for (var i = 0; i < len; i++) { count[array[i]]++; } for (var i = 1; i < countLen; i++) { count[i] += count[i - 1]; } for (var i = len - 1; i >= 0; i--) { res[count[array[i]] - 1] = array[i]; count[array[i]]--; } return res; }
分析code
CountingSort
的S(n) = O(n + max)優化htm
count[8-偏移量8] = count[0]
中CountingSortPlus
的S(n) = O(m + n)優化版的JS實現對象
// 此處沒有改變array function CountingSortPlus(array) { var len = array.length; if (len <= 1) { return array; } var min = max = array[0]; var count = [], res = []; for (var i = 1; i < len; i++) { if (array[i] > max) { max = array[i]; } if (array[i] < min) { min = array[i]; } } var countLen = max - min + 1; for (var i = 0; i < countLen; i++) { count[i] = 0; } for (var i = 0; i < len; i++) { count[array[i] - min]++; } for (var i = 1; i < countLen; i++) { count[i] += count[i - 1]; } for (var i = len - 1; i >= 0; i--) { res[count[array[i] - min] - 1] = array[i]; count[array[i] - min]--; } return res; }