基数排序
2016-04-23 23:05
197 查看
***基数排和归并排序一样是稳定的排序算法,时间复杂度,平均情况和最坏情况下为O(d(r+n)),最坏情况为O(d(dr+n))***
详解:
我们先根据序列的个位数的数字来进行分类,将其分到指定的桶中。例如:R[0] = 50,个位数上是0,将这个数存入编号为0的桶中。
分类后,我们在从各个桶中,将这些数按照从编号0到编号9的顺序依次将所有数取出来。 这时,得到的序列就是个位数上呈递增趋势的序列。 按照个位数排序: {50, 30, 0, 100, 11, 2, 123, 543, 187, 49}。 接下来,可以对十位数、百位数也按照这种方法进行排序,最后就能得到排序完成的序列。 C++实现如下:(代码已经测试)
#include<iostream> using namespace std; //得到数字ndigit位上的数字,0为个位 int getN(int n,int digit){ int k=1; for(int i=0;i<digit;i++){ k*=10; } return n/k%10; } void cardinalSort(int a[],int n){ //新建二维数组,第一个数字为这一排的个数 int **p=new int*[10]; for(int i=0;i<10;i++){ p[i]=new int[n+1]; //个数初始化为0 p[i][0]=0; } for(int i=0;i<=9;i++){ //将每排元素个数标志清0 for(int i=0;i<10;i++){ //个数初始化为0 p[i][0]=0; } //分类 for(int j=0;j<n;j++){ //取得元素的相应位数上的数字 int digit=getN(a[j],i); int count=p[digit][0]; p[digit][count+1]=a[j]; p[digit][0]++; } //记录 int t=0; //数组重排 for(int m=0;m<=9;m++){ for(int l=1;l<=p[m][0];l++){ a[t++]=p[m][l]; } } } } int main(){ int a[]={56,789,110,34,56,111,123,455,139,234}; cardinalSort(a,10); for(int i=0;i<10;i++){ cout<<a[i]<<" "; } cout<<endl; return 0; }
相关文章推荐
- POJ 3468 A Simple Problem with Integers 线段树
- jQuery.validate表单验证
- 概率分布
- PHP文件操作(转)
- 团队项目冲刺第六天
- 评价用过的浏览器
- 调整数组顺序使奇数位于偶数前面
- 安卓开发 第四篇 我的安卓应用架构设计-----Presenter类
- java.lang.IllegalThreadStateException异常原因解析
- Dialog插件artDialog
- Linux内核分析期末总结 20135115臧文君
- HDU 1205 吃糖果(数学题)
- Javascript实现树结构
- poj:垂直直方图
- kmp算法模板
- 团队项目个人每日总结(4.23)
- Docker常用命令
- ZOJ 3943 Himalayas
- android-向读写sdcard
- GDOI2016集训总结 —— Part 1