資料結構之計數排序

2021-10-10 01:21:00 字數 2046 閱讀 9592

計數排序是一種比較快速的排序方法,相對於氣泡排序、快速排序、堆排序、雞尾酒排序等,計數排序是一種不需要進行元素之間對比的排序演算法,但是該演算法也有一定的侷限性。

演算法思路:

需要使用乙個計數陣列,將待排序陣列中的每個元素遍歷一遍,將每個元素出現的個數放到計數陣列中,元素的值是多少就在計數陣列相應的下標元素上的計數加1。舉例:

待排序陣列:[2,4,3,2,2,2,5,5,6,2,9,8,8,9]

通過計算,可以知道當前陣列的最大值是9,所以建立乙個大小為9+1的陣列,然後遍歷該陣列,並記錄每個元素出現的次數,計數陣列如下:

[0, 0, 5, 1, 1, 2, 1, 0, 2, 2]

然後,按順序遍歷該計數陣列即可,陣列中元素的值代表以該下標為值的元素在陣列**現的次數。結果如下:

公升序排序:[2, 2, 2, 2, 2, 3, 4, 5, 5, 6, 8, 8, 8, 9]

public

class

countsort

public

void

increasesortorigin()

int[

] countarray =

newint

[max+1]

;for

(int i =

0; i < n; i++

) system.out.

println

(arrays.

tostring

(countarray));

int c=0;

for(

int i =

0; i < max; i++)}

}}

當待排序陣列中的最大值很大時,那麼可能會浪費很多空間,因為需要建立乙個空間很大的計數陣列來存放計數,且此時元素有不多的話,那浪費將更加嚴重。那麼如何對其進行優化呢,可以使用乙個最大和最小值,使用相對值來存放計數。

如下面的陣列:

[92,94,93,92,92,92,95,95,96,92,99,98,98,99],如果按照上面的思路可能需要乙個陣列空間為99的計數陣列,但是元素的值主要集中在90-100之間,那麼前面90個空間就浪費了。所以使用相對位置進行計數。讓陣列中每乙個元素減去陣列中的最小元素的值,當對計數陣列進行還原時,再加上最小值進行還原。使用相對計數的話,可以看到計數陣列的空間就小很多。

}}由於計數排序使用使用乙個計數陣列進行緩衝,且計數陣列的大小為max-min=m,原始陣列的大小為n,從演算法中可以看到,需要對原陣列資料進行3次遍歷,對計數資料進行1次遍歷,所以空間複雜度為3n+m->o(n+m)如果不考慮原陣列的大小的話,只考慮額外的開銷,那麼該演算法的空間複雜度為o(m)

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

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

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

一 計數排序 很好理解,就是對應每個數我們統計每個數字出現的次數,然後用乙個直接定址的雜湊表來存放資料,在通過遍歷這個雜湊表,進而就可以排好序了 如下所示 實現如下所示 void countsort int array,int size 開闢輔助空間 int range maxdata mindat...

資料結構 計數排序

題目來自灰灰考研 counting sort基本思想 對於給定的輸入序列中的每乙個元素x,確定該序列中值小於x的元素的個數 一旦有了這個資訊,就可以將x直接存放到最終的輸出序列的正確位置上。它建立乙個長度為這個資料範圍的陣列c,c中每個元素記錄要排序陣列中對應記錄的出現個數。下面以示例來說明這個演算...