排序算法之桶排序

(1)假设有欲排数据序列如下所示:


73  22  93  43  55  14  28  65  39  81


首先根据个位数的数值,在遍历数据时将它们各自分配到编号0至9的桶(个位数值与桶号一一对应)中。


分配结果(逻辑想象)如下图所示:


分配结束后。接下来将所有桶中所盛数据按照桶号由小到大(桶中由顶至底)依次重新收集串起来,得到如下仍然无序的数据序列:


81  22  73  93  43  14  55  65  28  39


接着,再进行一次分配,这次根据十位数值来分配(原理同上),分配结果(逻辑想象)如下图所示:


分配结束后。接下来再将所有桶中所盛的数据(原理同上)依次重新收集串接起来,得到如下的数据序列:


14  22  28  39  43  55  65  73  81  93


观察可以看到,此时原无序数据序列已经排序完毕。如果排序的数据序列有三位数以上的数据,则重复进行以上的动作直至最高位数为止。


追问:观察原无序数据序列中73   93   43 三个数据的顺序,在经过第一次(按照个位数值,它们三者应该是在同一个桶中)分配之后,


在桶中顺序由底至顶应该为73  93  43(即就是装的迟的在最上面,对应我们上面的逻辑想象应该是43  93  73),对吧?这个应该可以想明白吧?理论上应该是这样的。


但是分配后很明显在3号桶中三者的顺序刚好相反。其实这个也正是基数排序稳定性的原因(分配时由末位向首位进行),请看下文的详细分析。


再思考一个问题:既然我们可以从最低位到最高位进行如此的分配收集,那么是否可以由最高位到最低位依次操作呢? 答案是完全可以的。


基于两种不同的排序顺序,我们将基数排序分为LSD(Least significant digital)或MSD(Most significant digital),


LSD的排序方式由数值的最右边(低位)开始,而MSD则相反,由数值的最左边(高位)开始。


注意一点:LSD的基数排序适用于位数少的数列,如果位数多的话,使用MSD的效率会比较好。


MSD的方式与LSD相反,是由高位数为基底开始进行分配,但在分配之后并不马上合并回一个数组中,而是在每个“桶子”中建立“子桶”,将每个桶子中的数值按照下一数位的值分配到“子桶”中。


在进行完最低位数的分配后再合并回单一的数组中。


LSD法实现

#include<stdio.h>
#include<stdlib.h>
int getdigit(int x,int d)
{
int a[]={1,1,10,100};
return (x/a[d])%10;
}
void radixsort(int *a,int num,int d)
{
const int radix=10;
int i,j,k;
int *bucket=(int *)malloc(num*sizeof(int));//数组长度设置为变量值
for(k=1;k<=d;k++)
{
int count[10]={0};
for(i=0;i<num;i++)
count[getdigit(a[i],k)]++;
for(i=1;i<radix;i++)
count[i]=count[i]+count[i-1];
for(i=num-1;i>=0;i--)
{
j=getdigit(a[i],k);
bucket[count[j]-1]=a[i];
--count[j];
}
for(i=0;i<num;++i)
a[i]=bucket[i];
}
free(bucket);
}
int main()
{
int i;
    int a[23]={14,1,16,20,26,28,5,15,12,2,3,9,4,6,17,7,8,10,11,13,989,999,888};
radixsort(a,23,3);
for(i=0;i<23;i++)
printf("%d\t",a[i]);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值