基数排序有2中方式,最高位优先(MSD)和最低位优先(LSD)。下面以LSD为例。
个人总结的基数排序的算法思想如下:
基数排序维护一个队列,因为该队列是以最低位为基数来保存各个元素的,所以,我姑且叫它为基数队列(~~)。基数列的大小与待排的数组的大小相同。
首先从最低位开始,扫描待排数组,每遍历完一次就完成一次基数队列的建立。再用基数队列来更新原数组。循环此过程,循环的次数取决于原数组中最大的位数。
基数排序的具体过程如下图:
站在巨人的肩膀上,我自己写的一点伪码:
/***说明
利用数组f[n]来模拟队列来实现基数排序.
r[n]里面的最大数为多少位,外循环就进行多少趟.每趟进行n次比较..
r[n]:待排数组.有一个next域,用来表示它所指向的那个元素..
f[n]:模拟队列的数组,每趟模拟完后就用模拟出来的队列更新r[n]...有一个next域,用来标记某个队列的对头是否已经有所指向了...
***/
/****
基数排序算法开始...
***/
for(int k=1;k<=r[n]中最大值得位数;k++)
{
初始化r[n]的next域,都赋值为-1...
初始化f[n]的next域,都赋值为-1...
for(int i=0;i<n;i++)
{
int j = fenliweishu(r[i],k);//分离r[i]的第k位数出来...
if(f[j].next == -1)//该趟的第一次建立虚拟队列,队头还没有指向任何东西...
{
f[j].next = r[i];//队头指向本次的r[i]...
}
else
{
int p = f[j].next;
while(p!=-1)
{
int temp = p;//保存p
p = r[p].next;//更新p
}
r[temp].next = r[i];
}
}//2.for-end...
//对r[n]进行更新...
for(i=0,j=0;i<n;i++)
{
p = f[i].next;
while(p!=-1)
{
r[j] = r[p];//更新r[n]...
p = r[p].next;
j++;
}
}
}//wai_for-end
//分离位数功能
int fenliweishu(int a,int b);
{
int j;
switch(b)
{
case 1:
x = (a%10)/1;
case 2:
x = (a%100)/10;
case 3:
x = (a%1000)/100;
case 4:
x = (a%10000)/1000;
}
return j;
}