資料結構 計數排序

2021-10-08 03:17:12 字數 1531 閱讀 9347

之前講到的插入、希爾、選擇、堆、冒泡、快速、歸併排序都屬於比較排序(涉及到兩個數的比較),接下來要講到一種非比較排序演算法—計數排序。

1 什麼是計數排序

計數排序是一種非比較性質的排序演算法,元素從未排序狀態變為已排序狀態的過程,是由額外空間的輔助和元素本身的值決定的。計數排序過程中不存在元素之間的比較和交換操作,根據元素本身的值,將每個元素出現的次數記錄到輔助空間後,通過對輔助空間內資料的計算,即可確定每乙個元素最終的位置。

2 演算法步驟

假設一組資料密集的集中在0–9的範圍內

計算出該組資料的範圍:最大數減去最小數再加1,9-0+1為10。申請一段新的空間,長度為剛剛計算出的範圍,全部置0。

計算array中每個數出現的次數,將次數填寫在temp中對應的座標下,例如:0出現了兩次,temp[0]=2,1出現了2次,temp[1]=2…

最後按照統計次數對資料進行**:

問題:假如排100–199之間的資料,temp該申請多大的空間。假如申請200個空間,那麼前100個空間將會浪費掉。

解決方法:統計元素次數時,給temp的座標減去最小值,相當於把資料又平移到座標為0–9之間,之後**資料時在加上最小值。

3 **實現

void

countsort

(int array,

int size)

//計算用來計數的空間個數:maxvalue-minvalue+1,申請用來儲存計數的空間

int range = maxvalue - minvalue +1;

int* temp =

(int*)

malloc

(range*

sizeof

(int))

;memset

(temp,0,

sizeof

(int

)*range)

;//統計區間中每個元素出現的個數

for(

int i =

0; i < size;

++i)

temp[array[i]

- minvalue]++;

//**

int index =0;

for(

int i =

0; i < range;

++i)

}free

(temp)

;}

4 特性1.計數排序在資料範圍集中時,效率很高,但是適用範圍及場景有限。

2. 時間複雜度:o(n)n表示元素的個數

3. 空間複雜度:o(m) m表示範圍,也就是元素種類的個數

4. 穩定性:穩定

資料結構 計數排序

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

資料結構 計數排序

計數排序基於桶排序。比如待排陣列 a 5 那麼就需要建造 105 max 100 min 1 6 大小的臨時陣列,將這 5 個元素按照,值減 100 min 作為下標儲存在臨時陣列中。如下圖所示 計數排序 param a paramn private static void jishu int a,...

資料結構 九 計數排序

1 演算法流程 1 求取待排序陣列a 的最大值 max 2 建立乙個新的陣列c max 1 用於統計陣列 a中的每個元素 a,小於等於 a的個數。3 根據小於等於a 的個數,來確定排序後,a在排序陣列中的位置,進行位置填充 2 實現 寫 需要注意事項 1 計數統計結束後,我們根據c a 的大小填充元...