该算法是以空间换取时间的算法,其时间复杂度为O(n),时间复杂度优于所有比较排序。但是占用空间很大,特别当数组中数据不是很紧凑时,占用空间更大
具体代码如下,代码原理见注释:
//计数排序
//算法时间复杂度是O(n)
//该算法是典型的以空间换取时间的算法空间占有O(n*2+k)
//特别当k很大时,该算法占有空间很大
#include<iostream>
using namespace std;
void CountSort(int a[],int length,int b[],int k)
{
int c[100]={0};
int i,j;
//c[i]包含等于i的元素的个数
for(j=0;j<length;j++)
{
c[a[j]]+=1;
}
//c[i]包含小于等于i的元素的个数
for(j=1;j<=k;j++)
{
c[j]+=c[j-1];
}
//将a[j]放到正确的位置
for(j=length-1;j>=0;j--)
{
b[c[a[j]]]=a[j];
c[a[j]]-=1;
}
}
int main()
{
int a[20],b[21];
int i;
for(i=0;i<20;i++)
{
a[i]=rand()%50;
cout<<a[i]<<' ';
}
cout<<endl;
CountSort(a,20,b,50);
//注意数组b是从下标为1的开始存储数据,因为数组c中元素最小为1
for(i=1;i<21;i++)
{
cout<<b[i]<<' ';
}
cout<<endl;
}