完整的计数排序
2013-08-12 15:27
162 查看
计数排序要求数据的大小范围已知,可以将待排序的数据一一映射到一个计数器。这个计数器一般用数据来表示。如人的年龄: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;
}
或者 对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;
}
相关文章推荐
- 第二十篇:内部排序之五:计数排序、基数排序和桶排序(含完整源码)
- 【数据结构与算法】内部排序之五:计数排序、基数排序和桶排序(含完整源码)
- 【数据结构与算法】内部排序之五:计数排序、基数排序和桶排序(含完整源码)
- 最大最完整的---NAG Fortran 算法库
- 第十四周-(项目六)完整复制字符串。
- Linux查看进程运行的完整路径方法
- Linux下如何完整的构建cmake项目
- 如何使用本地账户“完整”安装 SharePoint Server 2010
- C#完整的通信代码(点对点,点对多,同步,异步,UDP,TCP)
- IOS设备设计完整指南
- LuoYing RPG教程-JME3游戏创建、场景编辑、载入完整示例教程
- TFS 2010 备份和恢复的完整解决方案
- 关于大数运算(不完整版)
- JavaScript+CSS无限极分类效果完整实现方法
- poi操作ppt图表史上最完整示例演示
- 理解HTTP消息头【很完整,例子也很丰富】
- [Other] Inno Setup 使用心德-一个完整的项目 包括.NET组建捆绑 去空格等
- 完整的创建数据库及实例,数据泵的导入、导出 impdp expdp
- 一次完整的http请求
- oracle一个事务的完整流程分析