zoukankan      html  css  js  c++  java
  • 八大基本排序--基数排序

    原数组和桶如下:

    第一次按照个位排序如下

    取出的时候按照从0~9的顺序,且同一个桶中,先放进去的先出来

    第二次按照十位排序如下

    取出结果如下

    第三次次按照百位排序如下

    取出结果如下:

    此时数组已经有序了

     

    代码思路:

    我们排序的次数取决于数组中最大是数字的位数

    import java.util.Arrays;
    
    //基数排序
    public class RadixSort {
    
        public static void main(String[] args) {
            int[] arr = { 23, 6, 189, 45, 9, 287, 56, 1, 798, 34, 65, 652, 5 };
            radixSort(arr);
            System.out.println(Arrays.toString(arr));
        }
    
        public static void radixSort(int[] arr) {
            //先找到这个数组里面最大的数字
            //排多少轮,取决于数组中最大的数字是几位数
            int max=arr[0];
            for(int i=1;i<arr.length;i++) {
                if(arr[i]>max) {
                    max = arr[i];
                }
            }
    //        System.out.println(max);
            //计算取到的最大值max是几位数:把max变成字符串类型,然后计算其长度
            String maxs = "";
            maxs = maxs+max;
            int maxLen = maxs.length();
    //        System.out.println(maxLen);
            
            //用于临时存放数据的数组(那0-9的十个桶)
            int[][] temp = new int[10][arr.length];
            //用于记录temp中每一个桶中存放数据的数量
            int[] count =new int[10];
            
            //根据最大长度决定比较的次数
            for(int i= 0, n=1;i<maxLen;i++,n=n*10) {
                //取出数组中每个数字的余数
                for (int j = 0; j < arr.length; j++) {
                    int ys = arr[j]/n%10;
                    temp[ys][count[ys]] = arr[j];//关键是放在第几列,需要用一个数组辅助计算
                    count[ys]++;
                }
    //            if (i==0) {
    //                for (int[] temps : temp) {
    //                    System.out.println(Arrays.toString(temps));
    //                }
    //                System.out.println(Arrays.toString(count));
    //            }
                //
                int index =0;
                //把数字取出来,看count[]数组(记录数量)中的个数,如果个数=0,就不取
                for(int k=0;k<10;k++) {
                    if(count[k]!=0) {
                        //遍历temp[][]数组
                        for(int l =0;l<count[k];l++) {
                            arr[index++]=temp[k][l];
                        }
                    }
                    //把数量置为0
                    count[k]=0;
                }
            }
        }
    }
  • 相关阅读:
    测试本地node包
    webpack4+react多页面架构
    身为前端开发工程师,你需要了解的搜索引擎优化SEO.
    代码改变世界 | 如何封装一个简单的 Koa
    云计算系统測试之技术概念
    Cocos2d-x3.0 从代码中获取cocostudio编辑的UI控件
    Spring使用HibernateDaoSupport操作数据
    gitlab一键安装 笔记
    【TCP/IP】IP路由选择
    ios网络学习------3 用非代理方法实现异步post请求
  • 原文地址:https://www.cnblogs.com/yuange678/p/10667213.html
Copyright © 2011-2022 走看看