前奏
基数排序是桶排序升级版,利用桶思想将移动对应的位数放到各个对应的桶中,在取出达到一定次数下就会变成有序列表
也是一种空间换时间的思想
思路
思路:
1:创建一个长度为10的二维数组,代表十个桶
2:然后遍历对应的无序列表移动当前位数按照位数值放入到对应的桶中 ,本次循环无序列表结束后也是放入结束后,然后依次取出
3:重复2步骤直到最大位数移动结束后整个列表就有序了
注意:基数排序是空间换时间,所以如果你要排序千万级数据移动要注意你的内存是否够多,不然的话内存溢出
基数排序要注意数值尽量别是负数
总结:
1:就是先将无需列表按照位数放入到对应的桶中
2:然后将桶中的数据依次的取出存入到原数组中
课外仅供参考
如果与一组8000个数据的数组排序的情况下 时间差不多10毫秒不到
如果与一组80000个数据的数组排序的情况下 时间差不多50毫秒不到
如果与一组800000个数据的数组排序的情况下 时间差不多120毫秒不到
如果与一组8000000个数据的数组排序的情况下 时间差不多1.3秒不到
如果与一组80000000个数据的数组排序的情况下 时间差不多11秒不到
图解 1
图解 2
代码
public static void bucket(int [] orderByArray){
int [][] bucket=new int[10][orderByArray.length];
int [] bucketValidNumber=new int[10];
int currentDivider=1;
int count=0;
while(true){
boolean flag=true;
for(int index=0;index<orderByArray.length;index++){
int currNumber=orderByArray[index];
int backetLocation=currNumber/currentDivider%10;
bucket[backetLocation][bucketValidNumber[backetLocation]]=currNumber;
bucketValidNumber[backetLocation]++;
int lastBacketLocation=currNumber/(currentDivider*10)%10;
if(lastBacketLocation>0)flag=false;
}
for(int index=0;index<bucketValidNumber.length;index++){
int validNumber=bucketValidNumber[index];
if(validNumber>0){
for(int i=0;i<validNumber;i++){
orderByArray[count++]=bucket[index][i];
}
bucketValidNumber[index]=0;
}
}
if(flag) break;
currentDivider*=10;
count=0;
}
}