一、前言
基数排序,也称分配式排序,在元素数组中,根据元素特性各自分配到适合的”桶“中,根据”桶“来对元素进行排序。MSD排序法,是以高位进行排序选择的排序算法,由高到低,子位再进行递归分配排序,以完成数组的有序重构。
二、逻辑实现
/**
* MSD基数排序
*/
public static void MSDjspx() {
long[] array=new long[]{203,106,302,523,176,302,175,564,462,531,88};
long maxVal=0;
List list=new ArrayList<>();//list数组记录所有元素
for(int i=0;i<array.length;i++) {
if(maxVal<array[i]) {
maxVal=array[i];
}
list.add(array[i]);
}
System.out.println("---数组最大值maxVal:"+maxVal);
int maxLen=String.valueOf(maxVal).length();
System.out.println("---数组最大长度maxLen:"+maxLen);
rtpx(list,maxLen);
System.out.println("---排序完成后的list:"+list.toString());
}
/**
* 入桶排序
* @param list 想要进行入桶排序的数组
* @param len 元素排序的依据位数
*/
public static void rtpx(List list,int len) {
if(len==0||list==null||list.size()<2) {//不再进行排序条件
return;
}
Map<Integer,List> map=new HashMap<>();
for(int i=0;i<10;i++) {//新建0~9的桶容器来存放元素
map.put(i, new ArrayList());
}
for(int i=0;i<list.size();i++) {//元素对应入桶
String curVal=String.valueOf(list.get(i));
int curLen=curVal.length();//当前值的长度
if(curLen<len){//当前元素长度小于最大长度取0,入桶
map.get(0).add(list.get(i));
}else{
int val=Integer.parseInt(curVal.substring(curLen-len,curLen-len+1));//依据位数的值
map.get(val).add(list.get(i));
}
}
list.clear();//清空数组
for(int i=0;i<10;i++) {//元素出桶排序
List tongList=map.get(i);
if(tongList.size()>1) {//桶里元素存在1个以上
rtpx(tongList,len-1);//递归方法改变tongList的排序
}
for(int j=0;j<tongList.size();j++) {
list.add(tongList.get(j));//添加数组,为数组重新排序
}
}
}
三、程序运行
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
MSDjspx();
}