zoukankan      html  css  js  c++  java
  • 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中的数值已经是排序好的了。
    
        }
  • 相关阅读:
    浅入了解GCD 并发 并行 同步 异步 多线程
    XSD
    想在Images.xcassets 只能用 imageNamed 加载里边的素材 其他方法 你就别费老劲了
    如何在SCENEKIT使用SWIFT RUNTIME动态加载COLLADA文件
    编译 wxWidgets3.0.2 on Mac OS X Yosemite 出错?!的解决方法
    3、技术积累方面总结
    2、日常计划管理总结
    站在客户的角度考虑问题
    公司管理的一点思虑
    项目管理一定要规范阿
  • 原文地址:https://www.cnblogs.com/clamp7724/p/11852406.html
Copyright © 2011-2022 走看看