這裡是傳送門⇒總結:關於排序演算法
平均時間複雜度
最優時間複雜度
最差時間複雜度
空間複雜度
穩定性計數排序
o(n+m)
o(n+m)
o(n+m)
o(n+max)
穩定優化後
o(n+m)
o(n+m)
o(n+m)
o(n+m)
穩定注:m為待排序列取值範圍大小,max為待排序列最大值
計數排序一種是「空間換時間」的排序,只能直接應用於非負整數的排序中(因為陣列下標是非負整數,相當於用待排元素i作為索引,陣列元素的值count[i]是待排序列中小於或者等於該下標i的元素數量)。
優勢在對於元素取值範圍m較小的待排序列的排序中,(優化後)時間複雜度是線性的ο(n+m),快於任何鍵值比較排序演算法。當然如果o(m)>o(nlogn)
,其效率反而不如基於鍵值比較的排序,若資料範圍m比排序資料的數量n大很多,就不適合用計數排序。
雖然演算法中有比較,但並非是鍵值間的比較,而是通過對元素值的計數和計數值的累加來確定的。
js實現
// 此處沒有改變array
function countingsort(array)
var max = array[0];
var count = ,
res = ;
for (var i = 1; i < len; i++)
}var countlen = max + 1;
for (var i = 0; i < countlen; i++)
for (var i = 0; i < len; i++)
for (var i = 1; i < countlen; i++)
for (var i = len - 1; i >= 0; i--)
return res;
}
優化優化版的js實現
// 此處沒有改變array
function countingsortplus(array)
var min = max = array[0];
var count = ,
res = ;
for (var i = 1; i < len; i++)
if (array[i] < min)
}var countlen = max - min + 1;
for (var i = 0; i < countlen; i++)
for (var i = 0; i < len; i++)
for (var i = 1; i < countlen; i++)
for (var i = len - 1; i >= 0; i--)
return res;
}
排序演算法之計數排序
今在學習中,遇到計數排序演算法,雖然其對待排序的序列要求嚴格,但對於符合條件的序列來說,其時間複雜度很小。故列於此,僅為學習記憶。參考資料 對於僅由大寫字母 或小寫字母 構成的無序序列,可採用下面演算法進行排序。該演算法不在序列的每個元素間進行比較,而是使用了乙個額外的help整型字串來記錄每個元素...
演算法 排序之計數排序
最近想到演算法導論中的計數排序,看看理解的怎麼樣試著講講自己的理解。1 思想 計數排序 是 線性時間的 排序演算法,時間複雜度為o n 雖然有一定的侷限性。但是還是很好的一種演算法。用2個陣列進行額外的儲存資訊,陣列 c 是對 資料中值相同的 記錄下來,以便後面查閱 b 是輸出的有序陣列,再將有序的...
排序演算法之計數排序
計數排序的思想特別簡單,就是記錄下序列中每個元素出現的次數,然後根據儲存次數的下標及出現次數將元素放回原陣列。時間複雜度為o n 資料範圍 空間複雜度為o 最大數 最小數 實現 pragma once int findmax int array,const int size return max i...