【code基础】基数排序的应用
给一个字符串数组,如:String[] nums={"102","473","251","814"};
请进行基数排序,返回 List<List> list,
其中List的index为基数位数,从0开始表示个位。index对应的list内容为截取的该位数的nums(如十位,则nums为 02,73,51,14)对应的值从小到大排序的下标
思路:
- 基数排序的思想是将大小转换为下标,通过遍历下标来实现对大小的排序,这样就能有序了,如下
bucket[s.charAt(bits-i-1) -'0'].add(idx)
,其下标为字符,值为index - 遍历bucket,得到从小到的数值的index
- 在十位的时候,基于个位的基本有序,
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为个位
}