计数排序要求数据的大小范围已知,可以将待排序的数据一一映射到一个计数器。这个计数器一般用数据来表示。如人的年龄:1-200; 字符串:0-255;
或者 对1000-2000之间的数排序,则可以映射到数组0-1000。 当然也可以在整个整数空间内计数,a[Max],但是这样的空间成本太大;
#include <iostream>
void CountSort(char *pStr)
{
if(pStr==NULL && *pStr=='\0')
return ;
int len=strlen(pStr);
int index=0;
int table[256]={0};
char *ptemp=new char[len+1];
ptemp[len]='\0';
for(int i=0;i<len;++i)
{
index=(int)(pStr[i]);
++table[index];
}
//找到每个元素的应放的最后的一个位置
for(i=1;i<256;++i)
{
table[i]+=table[i-1];
}
//倒着来,保证是稳定的排序
for(i=len-1;i>=0;--i)
{
index=(int)(pStr[i]);
ptemp[(table[index]-1)]=pStr[i];
--table[index];
}
strcpy(pStr,ptemp);
delete [] ptemp;
}
int main()
{
char str[]="wangjianwangaajjdadef";
CountSort(str);
cout<<strlen(str)<<endl;
return 0;
}