資料結構與演算法 計數排序

2021-08-02 14:05:00 字數 900 閱讀 2080

排序的思路常規的就是基於比較,比如常見的快排,冒泡等,這種排序最快也是onlogn。

非比較的排序思路基本是用乙個輔助陣列,把待排陣列的元素大小作為索引放入輔助陣列,用輔助陣列的位置來記錄大小,空間換時間。

適用場景:待排元素的值有乙個範圍,並且範圍是可以接受的。

方法:這裡會涉及幾個引數,作為接受引數,必須有待排陣列a,以及陣列值得範圍k。在函式實現的內部,要用k新建乙個計數陣列b,以及乙個結果陣列c。

先說最簡單的情形,假設所有待排元素是互異的,那麼只需要遍歷一次a,把a的每乙個元素的值作為b索引,存入b陣列中。最後再遍歷一次b,把存入的元素放入結果c中。可以看到,輔助陣列b的位置體現了待排陣列a的大小關係。

更加常見的,比如說基於陣列中出現的次數做排序。出現次數一般而言會穩定在乙個範圍內,所以適用於非比較排序思路。

b陣列就不能簡單的只儲存特定值的元素了,而應該儲存特定值元素的個數。然後再遍歷一次b,做一次向前的累加,就得到了特定值的元素的位置,即值為特定值的元素的個數加上比這個值小的元素的個數。此時,b陣列的值即為相應元素的個數,比如b[i]=j,那麼i和小於i的元素出現的次數為j,元素i的位置就是j。每得到乙個i就放在j位置,同時將b[i]減1,其他的元素i位置就應該往前放。為了使得排序是穩定的,這裡有乙個小技巧,最後以a為索引遍歷b時,a應該從後向前,這樣,a中最後的i就讓然放在最後的位置,倒數第二個i位於其前,以此類推。

public static int countingsort(int array, int k)

for(int i = 1; i < counting.length; i++)

for(int i = array.length - 1; i >= 0; i--)

return result;

}

該演算法的時間為on+k。線性。

資料結構與演算法 計數排序

計數排序 counting sort 是一種穩定的線性時間排序演算法。該演算法於1954年由 harold h.seward 提出。計數排序使用乙個額外的陣列c 其中第i個元素是待排序陣列a中值等於i的元素的個數。然後根據陣列c來將a中的元素排到正確的位置。當輸入的元素是 n 個 0 到 k 之間的...

資料結構與演算法之計數排序

計數排序的基本思想 在乙個陣列中對每個元素按大小進行排名次,乙個元素的名次是陣列中比他小的元素的個數加上左邊出現的與之相等的元素的個數 備註 這裡名次越高說明元素越大 例如陣列a 5,4,2,5,8,9 新建乙個相同大小的陣列用於儲存陣列元素的名次,得到名次陣列 r 2,1,0,3,4,5 名次計算...

資料結構與演算法(十二) 計數排序

計數排序是桶排序的乙個特例,即 桶的大小為1。這樣一來,分桶之後,每個桶內部就不需要排序了,只需將不同桶的資料合併到一起,組成排序好的序列。計數排序對資料的要求十分嚴格 找出原始陣列l中最大的元素值max 構造乙個計數陣列count,count的下標為從0到max,儲存的值為原陣列中元素值等於下標的...