基数排序[算法]
2015-12-09 18:26
288 查看
算法名称:基数排序[MSD最高位优先]
作者:Robert
基本思路:利用每个元素的本身自带的信息,优先比较位数靠后的大小,直到比较整个位数。
实现步骤:设置比较的几个梯度[通常是10进制],先按最低的[个位]进行排序后顺序链接,然后把处理过后的按第二位比较[十位]进行排序,以此类推即可将所有数字排序。
模板:
View Code
正确性:因为第一次使得个位大小从小到大,然后在保证个位从小到大的时候将十位数排序,这样就使得如果只看后两位数,十位数相同的数会依据个位数的大小自动的分好。以此类推,就满足从高位到低位都是有序的,并优先高位【表现在逆过程中】。
时空复杂度:大概是O(n*d),但是因为运用除法所以常数大一些。
主要用途:
1.基数排序是稳定的排序,同时也是稳定排序中比较快的,可以用于要求稳定排序的排序题中。
2.后缀数组的后缀排序可以使用以ASC码为进制的基数排序
作者:Robert
基本思路:利用每个元素的本身自带的信息,优先比较位数靠后的大小,直到比较整个位数。
实现步骤:设置比较的几个梯度[通常是10进制],先按最低的[个位]进行排序后顺序链接,然后把处理过后的按第二位比较[十位]进行排序,以此类推即可将所有数字排序。
模板:
inline int maxbit(int a[]){ int p=10,d=1; for(int i=0;i<n;i++) while(a[i]<=p) p*=10,d++; return d; } int d=maxbit(a); for(int k=1,p=1;k<=d;k++,p*=10){ for(int i=0;i<10;i++) c[i]=0; for(int i=0;i<n;i++) c[(a[i]/p)%10]++; for(int i=1;i<=10;i++) c[i]+=c[i-1]; for(int i=n-1;i>=0;i--) t[--c[(a[i]/p)%10]]=a[i]; for(int i=0;i<n;i++) a[i]=t[i]; }
View Code
正确性:因为第一次使得个位大小从小到大,然后在保证个位从小到大的时候将十位数排序,这样就使得如果只看后两位数,十位数相同的数会依据个位数的大小自动的分好。以此类推,就满足从高位到低位都是有序的,并优先高位【表现在逆过程中】。
时空复杂度:大概是O(n*d),但是因为运用除法所以常数大一些。
主要用途:
1.基数排序是稳定的排序,同时也是稳定排序中比较快的,可以用于要求稳定排序的排序题中。
2.后缀数组的后缀排序可以使用以ASC码为进制的基数排序
相关文章推荐
- windows执行命令来运行loadrunner录制好的脚本(收藏)
- 在Loadrunner中如何用system函数执行系统命令
- Divide Two Integers
- Divide Two Integers
- springMVC 引用@resource要要注意的问题
- 图片加载显示loading图的疑惑解决
- scrapy爬虫部署
- TC Hash Filter
- java 自定义注解以及获得注解的值
- python数据结构
- [javase学习笔记]-2.5 进制扫盲
- 微信点开分享文章所带的关键字
- Swift学习笔记 -- 函数和闭包
- 编程的智慧 意外在内网找到的资源
- ubuntu 数据库无法正常启动
- java引用传递和值传递的详细探讨
- Call can throw but it is not marked with try
- ListView不同布局的item的复用方法详解
- 程序日志
- [原创作品]一个实用的js倒计时器 postby:zhutty.cnblogs.com