计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。
原理
统计一个数序列中小于某个元素a的个数为n,则直接把该元素a放到第n+1个位置上。当然当过有几个元素相同时要做适当的调整,因为不能把所有的元素放到同一个位置上。计数排序假设输入的元素都是0到k之间的整数。
计数排序的一般实现:
void countSort(int src[],int dest[],int len,int k)
{
/* len is the length of src .
elements in src are all smaller than k. */
int i;
int *C = (int*)malloc(sizeof(int)*k);
for(i=0;i<k;i++)
C[i] = 0;
for(i=0;i<len;i++)
C[src[i]]++;
for(i=1;i<k;i++)
/* i start from 1. */
C[i] = C[i] + C[i-1];
for(i=len-1;i>=0;i--){
/*i start from len - 1. we could see the sorting is stable. */
dest[C[src[i]]-1] = src[i];/* C[src[i]]-1*/
C[src[i]] -= 1;
}
free(C);
}
测试数据:
2 5 3 0 2 3 0 3 (src)
2 2 4 7 7 8 (C)
0 0 2 2 3 3 3 5 (dest)
计数排序是稳定的哟。