完整的计数排序

计数排序要求数据的大小范围已知,可以将待排序的数据一一映射到一个计数器。这个计数器一般用数据来表示。如人的年龄:1-200; 字符串:0-255;
或者 对1000-2000之间的数排序,则可以映射到数组0-1000。 当然也可以在整个整数空间内计数,a[Max],但是这样的空间成本太大;

#include <iostream>

using namespace std;


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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值