计数排序(Counting Sort)
@[计数排序|算法]
计数排序是一种线性时间复杂度的排序算法。其特点是:
- 时间复杂度 : Θ(k+n) ;
- 稳定性 :具有相同值的元素在输出数组的相对次序和输入数组一致;
- 局限性 :只适用于整数排序,且实际应用中要求输入数组数值范围k不能太大。
前提假设
- 假设输入数组Arr的元素满足: Arr[i]∈{1,2,3,…,k} 。
- 输入未排序数组 A[1,…,n] ,输出已排序数组 B[1,…,n] ,临时存储空间: C[0,1,…,k] 。
基本思想
对每一个输入元素
x
,统计小于
代码实现
void CountingSort(int A[],int B[],int k){
int i,C[k+1];
for(i=0,i<=k,i++){ // let C[0,...,k]=0
C[i] = 0;
}
for(i=0,i<A.length,i++){ // counting numbers
C[A[i]] = C[A[i]]+1;
}
for(i=1,i<=k,i++){
C[i] = C[i]+C[i-1];
}
for(i=A.length-1,i>=0,i--){
B[C[A[i]]] = A[i];
C[A[i]] = C[A[i]]-1;
}
}