import java.util.Arrays;
//基数排序又名桶排序
public class TongSort {
public static void main(String[] args) {
int[] arr= {908,10000,513,689,300,74,87,255,336,1112};
//定义 装arr的二维数组,第一个里面装的是余数0-9,第二个最长为arr长度。
int[][] tong=new int[10][arr.length];
//定义二维数组余数的计数数组
int[] tongcount=new int[10];
//找到数组里最大的值
int max=arr[0];
for(int l=0;l<arr.length;l++) {
if(max<arr[l]) {
max=arr[l];
}
}
//用最大的值的长度来判断数字位数,从而判断要比较几次
int maxlength=(max+"").length();
int n=1;
//开始排序
for(int h=0;h<maxlength;h++) {
//将arr数组入桶
for(int i=0;i<arr.length;i++) {
//计算数组里每个数的余数,arr[i]/n%10是计算个位,十位,百位的数字大小的,因为n会变
int yushu=arr[i]/n%10;
//tong[][]二维数组,第一维放要比较位数的数字的大小,第二维放个数,tongcount[yushu]表示当前余数的数有多少个。
tong[yushu][tongcount[yushu]]=arr[i];
//每添加一个,余数计数器都要+1
tongcount[yushu]++;
}
//将桶中的数据放回arr数组中,定义游标index,arr可以使用游标
int index=0;
for(int j=0;j<tongcount.length;j++) {
//如果计数数组当前的余数不为0,表示桶中还有当前余数的数,要执行。
if(tongcount[j]!=0) {
//将桶中的取走
for(int k=0;k<tongcount[j];k++) {
arr[index]=tong[j][k];
index++;
}
}
//执行完要把计数器置为0;因为要按个位,十位,百位,等计算,不置为零会数组溢出。
tongcount[j]=0;
}
//计算完 一遍,会将n*10,用来计算更高位。
n=n*10;
}
//输出数组
System.out.println(Arrays.toString(arr));
}
}
桶排序基数排序代码及简要说明
最新推荐文章于 2024-06-28 15:08:54 发布