菜雞筆記之 計數排序

2021-10-07 08:56:21 字數 1503 閱讀 4073

計數排序:

計數排序是非比較排序,它是分布排序,其時間複雜度可以突破nlogn達到o(n),但是其適用範圍相對較小,不適合字串比較,不適合資料跨度較大的陣列的排序。

時間複雜度:o(n);

穩定性:穩定排序;

思路:1、開乙個與原始陣列一樣大的陣列result,用於排序後儲存結果;

2、開乙個臨時陣列temp,其長度的原始陣列元素中的最大值減最小值加1,用於統計原始陣列中各個元素出現的次數;(出現多少次,temp[a[i]]就自增多少次,這裡有乙個問題:a[i]可能為負數,可以通過將每乙個元素都減去最小值,轉化為非負數後再進行統計);

3、逆序遍歷原始陣列,根據temp裡的數找到這個元素要放在result陣列的那個位置,完成排序;

**實現(計數排序):

# include

# include

# include

intmain

(void

)//輸入

for(

int i =

0;i)//排序

void

countsort

(int*,

int*

,int);

countsort

(array,result,n)

;//輸出

for(

int i =

0;i)//釋放申請的記憶體

free

(array)

;free

(result)

;return0;

}void

countsort

(int

* array,

int* result,

int len)

//計數排序

if(max<

*(array+i))}

//臨時陣列

int* temp =

null

; temp =

(int*)

malloc

(sizeof

(int)*

(max-min+1)

);if(temp==

null

)//初始化臨時陣列

memset

(temp,0,

sizeof

(int)*

(max-min+1)

);//統計元素出現個數

for(i =

0;i)//執行以下操作後,*(temp+*(array+i)-min)減去1後就是*(array+i)要放入result陣列的位置

for(i =

1;i<

(max-min+1)

;i++

)//放入元素

for(i = len-

1;i>=

0;i--

)//釋放temp申請的記憶體

free

(temp)

;}

演算法筆記之 計數排序

適合整數排序,以及數值較小的情況。當輸入的元素是 n 個 0 到 k 之間的整數時,它的執行時間是 n k 計數排序不是比較排序,排序的速度快於任何比較排序演算法。由於用來計數的陣列c的長度取決於待排序陣列中資料的範圍 等於待排序陣列的最大值與最小值的差加上1 這使得計數排序對於資料範圍很大的陣列,...

菜雞筆記之 希爾排序

希爾排序 時間複雜度 平均o nlogn 穩定性 不穩定排序 思路 將資料分組,每相隔step 步長 對每一組進行插入排序。希爾排序為插入排序的進一步優化 實現 希爾排序 include include intmain void 輸入陣列 for int i 0 i 排序 void shellsor...

菜雞筆記之 桶排序

桶排序 桶排序可以理解為簡化版的計數排序,自然地限制條件就更多,適用範圍更窄,原理跟計數排序類似,而且比較簡單 桶排序大概比較適合於元素為正整數,且最大值不太大地情形,而計數排序還適用於整數 可含負整數 跨度不太大的情形,兩者都不適用於字串排序。時間複雜度 o n k 實現 桶排序 include ...