計數排序:
計數排序是非比較排序,它是分布排序,其時間複雜度可以突破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 ...