【本质--先排序个位,再排序十位,排百位...依次类推的过程】
获取待排序数组中的最高位数
//取计算最大值的位数
int max=arr[0];
for(int j=0;j<arr.length;j++) {
if(arr[j]>max) {
max=arr[j];
}
}
存储数据(桶排序中除了游标遍历外,必要时开辟虚拟空间):
for(int m=0;m<maxLen;m++) {
for(int i=0;i<arr.length;i++) {
int element=arr[i]/n%10;
int count=elementCounts[element];
//数据放入
bucket[element][count]=arr[i];
//桶纪录+1
elementCounts[element]++;
}
取出数据:
for(int k=0;k<elementCounts.length;k++) {
if(elementCounts[k]!=0) {
for(int l=0;l<elementCounts[k];l++) {
arr[index]=bucket[k][l];
index++;
}
}
//清空桶纪录
elementCounts[k]=0;
}
完整代码:
package Java.start;
import java.util.Arrays;
public class RadixSort {
//基数排序(桶排序)
public static void main(String[] args) {
int[] arr= {55,33,12,21,102,301,44,63,73,87,98};
sort(arr);
System.out.println(Arrays.toString(arr));
}
public static void sort(int[] arr) {
//取计算最大值的位数
int max=arr[0];
for(int j=0;j<arr.length;j++) {
if(arr[j]>max) {
max=arr[j];
}
}
int maxLen=(max+"").length();
//定义桶
int[][] bucket =new int[10][arr.length];
//定义桶记录工具
int[] elementCounts=new int[10];
//遍历maxLen遍
int n=1;
for(int m=0;m<maxLen;m++) {
//取个位
for(int i=0;i<arr.length;i++) {
int element=arr[i]/n%10; //对10取余
//element代表个位数值,也代表放到哪个桶
//读取桶记录中的数值
int count=elementCounts[element];
//数据放入
bucket[element][count]=arr[i];
//桶纪录+1
elementCounts[element]++;
}
//将数据从桶中取出
int index=0; //定义index游标,遍历待排序数组
for(int k=0;k<elementCounts.length;k++) {
if(elementCounts[k]!=0) {
for(int l=0;l<elementCounts[k];l++) {
arr[index]=bucket[k][l];
index++;
}
}
//清空桶纪录
elementCounts[k]=0;
}
n=n*10;
}
}
}
结果: