基数排序(Radix Sort)是桶排序的扩展,它的基本思想是:将整数按位数切割成不同的数字,然后按每个位数分别比较。
具体做法是:将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。
通过基数排序对数组{53, 3, 542, 748, 14, 214, 154, 63, 616},它的示意图如下:
在上图中,首先将所有待比较树脂统一为统一位数长度,接着从最低位开始,依次进行排序。
1. 按照个位数进行排序。
2. 按照十位数进行排序。
3. 按照百位数进行排序。
排序后,数列就变成了一个有序序列。
为什么要从个数开始比较,低位是有序的,高位中如果有相同的值,则只需在保持稳定的前提下对高位进行排序,结果自然有序。
//radix sort
//基数排序也是基于一种假设,假设所有数都是非负的整数
//基数排序的基本思路是从低位至高位依次比较每个数的对应位,并排序;对应位的比较采用计数排序也可以采用桶排序;
//基数排序是一种稳定的排序方法,不稳定的话也没法排序,因为某一位相同并不代表两个数相同;
#include
#include
using namespace std;
void countSort(vector& vec,int exp)
{//计数排序
vector range(10,0);
int length=vec.size();
vector tmpVec(length,0);
for(int i=0;i=0;--i)
{
tmpVec[range[(vec[i]/exp)%10]-1]=vec[i];
range[(vec[i]/exp)%10]--;
}
vec=tmpVec;
}
void radixSort(vector& vec)
{
int length=vec.size();
int max=-1;
for(int i=0;imax)
max=vec[i];
}
//提取每一位并进行比较,位数不足的高位补0
for(int exp=1;max/exp>0;exp*=10)
countSort(vec,exp);
}
int main()
{
int a[10]={53,3,542,748,14,214,154,63,616,589};
vector vec(a,a+10);
radixSort(vec);
for(int i=0;i
radixSort(a, n)的作用是对数组a进行排序。
1. 首先获取最大值,目的是计算出数组a的最大指数。获取到数组a中的最大指数之后,再从指数1开始,根据位数对数组a中的元素进行排序。排序的时候采用了计数排序。
2.countSort(vec, exp)的作用是对数组a按照指数exp进行排序。
下面简单介绍一下对数组{53, 3, 542, 748, 14, 214, 154, 63, 616}按个位数进行排序的流程。
a、个位的数值范围是[0,10)。因此,参见数组ranges,range[i]代表i之前的数据出现次数,也即当前数本应该在的位置。
b、 接着是根据数组range来进行排序。假设将排序后的数组存在tmpVec中;找出tmpVec和range之间的联系就可以对数据进行排序了
参考文章:http://blog.csdn.net/coslay/article/details/47806035