【code基础】基数排序的应用

给一个字符串数组,如:String[] nums={"102","473","251","814"};
请进行基数排序,返回 List<List> list,
其中List的index为基数位数,从0开始表示个位。index对应的list内容为截取的该位数的nums(如十位,则nums为 02,73,51,14)对应的值从小到大排序的下标

思路:

  1. 基数排序的思想是将大小转换为下标,通过遍历下标来实现对大小的排序,这样就能有序了,如下 bucket[s.charAt(bits-i-1) -'0'].add(idx),其下标为字符,值为index
  2. 遍历bucket,得到从小到的数值的index
  3. 在十位的时候,基于个位的基本有序,idx = list.get(i-1).get(j),在部分有序的基础上继续提取基数,存入下标,通过对基数的比较,得到十位的部分有序
  List<List<Integer>> list= new ArrayList<>();
  int bits = nums[0].length(); //位数

  for (int i = 0; i < bits; i++) {
      List[] bucket = new List[10];
      for (int j = 0; j < 10; j++) bucket[j] = new ArrayList<Integer>();
      List<Integer> tmp = new ArrayList<Integer>();

      for (int j = 0; j < nums.length; j++) {
          int idx;
          //初始情况,按照j的顺序来定义初始顺序
          if (i == 0 ) idx = j;
          //从十位开始,基于个位的基本有序来比较
          else idx = list.get(i-1).get(j);
          String s = nums[idx];

          //1. 将大小转换为下标,这样就能有序了
          bucket[s.charAt(bits-i-1) -'0'].add(idx);
      }
      //2.遍历bucket,得到从小到的数值的index
      for (int j = 0; j < 10; j++) {
          tmp.addAll(bucket[j]);
      }
      //tmp:有序的index
      list.add(tmp); //list下标为位数,0为个位
  }
posted @ 2022-09-26 19:55  xiaoyu_jane  阅读(20)  评论(0编辑  收藏  举报