基数排序基本思想是:比较各个位上的 数值先比较个位在比较十位、百位、、。适用于数据量大 差值也较大的情况 适用 时间复杂度O(kn)
12,444,999,1,4,99,89,98,100,210,211进行排序
1、借助一个叫做桶的工具
先进行个位数排序 然后拿出 从左到右、从上到下的顺序拿出
//定义桶
int bucket[][]=new int[10][arr.length];
//定义每一个桶里面存放多少数据的数组
int count[]=new int[10];
//把数组a放入桶里面
for(int i=0;i<arr.length;i++) {
//进行个位十位百位数比较的时候arr[i]/1%10、arr[i]/10%10、arr[i]/100%10
int element= arr[i] / 1 % 10;
bucket[element][count[element]]=arr[i];
count[element]++;
}
排完序后从左到右、从上到下的顺序拿出
//记录数组a的下标
int index=0;
//遍历count数组 如果count[k]>0那么对应的第几个桶就有数据全部拿出来之后把count[k]置0;
for(int k=0;k<count.length;k++) {
if(count[k]!=0) {
for(int i=0;i<count[k];i++,index++) {
arr[index]=bucket[k][i];
}
}
count[k]=0;
}
全部代码相比单个放入取出多了一步确定要拿出几步的过程
int max=arr[0];
for(int i=0;i<arr.length;i++) {
if(arr[i]>max) {
max=arr[i];
}
}
int maxLength=(max+"").length();
int bucket[][]=new int[10][arr.length];
int count[]=new int[10];
int n=1;
for(int j=0;j<maxLength;j++,n=n*10) {
完整代码:
public class ReadixSort {//基数排序 运用桶
public static void main(String[] args) {
int arr[]= {1,123,332,223,122,55,44,43,22,5,6,2,66,67};
put(arr);
}
public static void put(int arr[]) {
int max=arr[0];
for(int i=0;i<arr.length;i++) {
if(arr[i]>max) {
max=arr[i];
}
}
int maxLength=(max+"").length();
int bucket[][]=new int[10][arr.length];
int count[]=new int[10];
int n=1;
for(int j=0;j<maxLength;j++,n=n*10) {
for(int i=0;i<arr.length;i++) {
int element= arr[i] / n % 10;
bucket[element][count[element]]=arr[i];
count[element]++;
}
int index=0;
for(int k=0;k<count.length;k++) {
if(count[k]!=0) {
for(int i=0;i<count[k];i++,index++) {
arr[index]=bucket[k][i];
}
}
count[k]=0;
}
}
System.out.println(Arrays.toString(arr));
}
}