计数排序可以对0到k区间的整数进行排序,K为整数,排序的时间复杂度为O(n+k),它不是基于比较的算法,时间复杂度低于任何基于比较的排序算法。计数排序是稳定的排序。它的基本思想是对每一个输入元素x,输入小于x的元素个数,利用这一信息,可以直接把x放到它在输出数组中的位置上。在计数排序算法的代码中,假设输入是一个数组A[1…n],A.length=n,还需要两个数组,B[1…n]存放排序的输出,C[0…k]提供临时存储空间。
《算法导论》中给出了计数排序的算法伪代码:
COUNT—SORT(A,B,k)
let C[0..k]be a new array
for i=0 to k
C[i]=0
for j=1 to A.length
C[A[j]]=C[A[j]]+1
//C[i]now contains the number of elements equal to i
for i=1 to k
C[i]=C[i]+C[i-1]
//C[i] now contains the number of elements less than or equal to i
for j=A.length downto 1
B[C[A[j]]]=A[j]
C[A[j]]=C[A[j]]-1
计数排序的代码为(数组待排序的数字在0到99之间):
# include <iostream> using namespace std; # include <stdlib.h> int main() { void fsort(int a[],int b[],int n); int a[10]={15,54,40,69,91,3,7,9,10,45}; int b[100]; int i; fsort(a,b,10); for(i=1;i<=10;i++) cout<<b[i]<<endl; system("pause"); return 0; } void fsort(int a[],int b[],int n) //计数排序 { int c[100]; int i=0; for(i=0;i<100;i++) c[i]=0; for(i=0;i<n;i++) c[a[i]]++; for(i=1;i<100;i++) c[i]+=c[i-1]; //C[i]存放的是小于或者等于i的元素的个数 for(i=n-1;i>=0;i--) { b[c[a[i]]]=a[i]; //将a[i]放到b中合适的位置 c[a[i]]--; } }
原文:http://blog.csdn.net/u011608357/article/details/21328735