排序演算法之計數排序

2022-06-09 23:39:21 字數 1454 閱讀 6798

這裡是傳送門⇒總結:關於排序演算法

平均時間複雜度

最優時間複雜度

最差時間複雜度

空間複雜度

穩定性計數排序

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...