java -算法 - 桶排序

桶排序是拿空间换时间,在数量特别大,桶很多的时候速度比快速排序还要快一些。(但是如果数量过百万可能会内存溢出(数组太长))

设置10个数组(代表0-9号桶)

先按从个位一次放入对应桶中,然后依次取出放回数组。

然后按十位。。。

百位。。。

。。。

直到最高位都为0.

123,125,214,243,222

第一次(个位):

2: 222

3:123,243

4:214

5:125

然后取出: 222,123,243,214,125

第二次(10位)

1:214

2:222,123,125

4:243

然后取出:214,222,123,125,243

第3次(100位)

1:123,125

2:214,222,243

然后取出:123,125,214,222,243

没有1000位,所以排序结束

其实本质就是按位比较。

 

 //桶排序
    public void bucketSort(int[] a) {


        //先要得到最大的位数,判断循环多少次
        int max = a[0];
        for (int i = 0; i < a.length; i++) {
            if (max < a[i]) {
                max = a[i];
            }
        }
        //此时max就是最大值
        int maxlength = ("" + max).length(); //先把max变成字符串然后取长度,得到位数

        int n = 1;  //被除数 第一次是1,第二次是10(这样比如1212/10 = 121 ,然后再对10取余,得到10位的1),第三次是100 ..
        for (int k = 0; k < maxlength; k++, n = n*10) {//每次被除数 * 10
            int[][] bucket = new int[10][a.length];  //10个桶
            int[] b_max = new int[10];             //记录10个桶内数据的数量方便插入 java的int型默认值是0,所以不赋值也能用.
            for (int j = 0; j < a.length; j++) {
                int num = (a[j] / n % 10); //用取余得到当前位 ps: % 和 / 优先级一样,所以错左向右计算
                bucket[num][b_max[num]] = a[j];
                b_max[num]++;
            }

            //放完桶后,取出回装
            int a_max = 0; //用来往a回存
            for (int i = 0; i < 10; i++) { //遍历10个桶
                for (int j = 0; j < b_max[i]; j++) { //遍历其中第i个桶
                    a[a_max] = bucket[i][j];
                    a_max++;
                }
            }
        }
        //循环完毕后,a中的数值已经是排序好的了。

    }

 

 

posted @ 2019-11-13 20:04  不咬人的兔子  阅读(280)  评论(0编辑  收藏  举报