基数排序的思想以及伪代码实现

桶排序算法总结
通过分配和收集的方式进行排序
value/(max+1)*n(这是计算每个元素value应该放入哪个桶里)
算出value应该到哪个桶里面,得出的是
桶的下标


O(N)---O(NlgN) //最好的情况是每个元素分到一个桶里为O(N)
最坏情况是所有元素分到一个桶里,对桶里的元素用快速排序
或者是插入排序则是O(NlgN)的复杂度

k=N/M N个元素,M个桶
O(N+C)
O(N+NlgN-NlgM)(M等于1的时候就是O(N+lgN))


基数排序的过程也是通过分配和收集过程实现排序。
特点,没有负数(有负数的话,做一次转换全部变为正数
,基数排序的桶的个数比较固定为0-9个)

入桶的次数是根据数组的最大值的元素的位数
伪代码如下思路如下:

1.定义一个可变长度的数组ArrayList[]
2.初始化数组
3.求出传入数组的最大元素,根据最大元素确定入桶比较
的次数,个位,十位,百位。。。。,循环进行排序
4,排序的过程是(根据个位入库,分别为9个桶,)


sort(arr)
   //准备工作
   总共有10个桶,每个桶装的个数不一定,适合用ArrayList
   private static ArrayList[] bucket = new ArrayList[10]
   //ArrayList[]buffer = new [9] ArrayList;
   //静态化代码块初始化桶
   static {
   for (int i =0; i<bucket.length;i++)
    buffer[i] = new ArrayList()
   }
   arrMax = maxOf(arr)
   d=1
   dnum=1
   while (arrMax/10!=0)
    {
       dnum++;
           arrMax=arrMax/10 //也可以这样max/=10
          }
   while(d<=dum)
       //依据第二个参数进行出桶和入桶。
       sort(arr,d++)//d位数。
//基数排序的按照d的位数分配和收集
sort(arr,d)
    for (int i = 0; i<arr.size();i++)
    pushbucket(arr[i],getDigitOn(arr[i],d)) //入桶操作
        第二个参数为数据的第k位的值
    
    //出桶操作(从每个桶中的元素依次压入原数组)
    int k = 0;
    for(int j=0; j<bucket.length;j++)
        for(Object m: bucket[j]) {
        arr[k++] = (Integer)m;
        }
    //桶数据清空
    clearAll();

    //for (int i=0;i<=9;i++)  思路有问题
    //for(int j =0;j<arr.length;j++)
      //  arr[j] = buffer[i]
    
void clearAll(){
    for (ArrayList b: bucket)
         b.clear();
}


pushbubble(data,digitOn)
    switch(digitOn)
    case 0:
         buffer[0].add(data);
             break;//注意break的运用
        case 1:
             buffer[1].add(data)
             break;
        ......
        case 9:
             buffer[9].add = arr[i]
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值