基数排序

基数排序:
将待排序的数字按照从尾部开始数第一位,第二位,将其对应的位上面的数字放入
0-9号桶里面,例如20,21,40,30,44
第一轮将20放入0号桶,21放入1号桶,40放入0号桶,30放入0号桶,44放入4号桶
然后按照桶中排放的顺序放回原数组,在进行下一轮重复的排放操作
有几位数就进行几轮操作

代码示例:
package sort;

import java.util.ArrayList;
import java.util.Arrays;

public class CardinalSort {

    /*基数排序*/

    static ArrayList<Integer> [] bucket = new ArrayList[10];

    static {

        for (int i = 0; i < bucket.length; i++) {

            bucket[i] = new ArrayList();
        }
    }

    public static void main(String[] args) {

        int a [] = {-1,4,1,6,3,0,-5,67,800,1,1000,5};

        int min = a[0];

        for (int j : a) {

            if (j < min) {

                min = j;
            }
        }

        min = -min;

        for (int i = 0; i < a.length; i++) {

            a[i] = a[i]+min;
        }

        cardinalSort(a);

        for (int i = 0; i < a.length; i++) {

            a[i] = a[i]-min;

        }

        System.out.println(Arrays.toString(a));
    }

    private static void cardinalSort(int[] a) {


        int max = a[0];

        for (int i = 0; i < a.length; i++) {

            if(a[i]>max){
                max = a[i];
            }
        }

        int d = 1;

        int curr = 1;

        while (max/10!=0){

            d++;

            max = max/10;
        }

        while (curr<=d){

            sort(a,curr++);
        }


    }

    private static void sort(int[] a, int d) {

        for (int i = 0; i < a.length; i++) {

            PutInBucket(a[i],GetDiton(a[i],d));
        }

        int curr = 0;

        for (int i = 0; i < bucket.length; i++) {

            for (Integer l:bucket[i]
                 ) {

                a[curr++] = l;
            }
        }

        ClearAll();
    }

    private static void ClearAll() {

        for (ArrayList a:bucket
             ) {

            a.clear();
        }
    }

    private static void PutInBucket(int i, Integer getDiton) {

        switch (getDiton){

            case 0:
                bucket[0].add(i);
                break;
            case 1:
                bucket[1].add(i);
                break;
            case 2:
                bucket[2].add(i);
                break;
            case 3:
                bucket[3].add(i);
                break;
            case 4:
                bucket[4].add(i);
                break;
            case 5:
                bucket[5].add(i);
                break;
            case 6:
                bucket[6].add(i);
                break;
            case 7:
                bucket[7].add(i);
                break;
            case 8:
                bucket[8].add(i);
                break;
            default:
                bucket[9].add(i);
                break;
        }
    }

    private static Integer GetDiton(int i, int d) {

        int x = 0;

        while (d>0){

            x = i%10;

            i = i/10;

            d--;
        }

        return x;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值