计数排序可以对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]]--;
}
}