基数排序
对关键字进行“分配”与“收集”两种操作即可完成。
基数排序原理(图文解说):
{15,12,23,32,29,25,18,17,21,22}
首先,将数组中的元素个位与方框中的数字对应,将数组元素依次的根据个位放在方框中,然后再依次取出,如下图示一与图示二。**第一轮是取个位上的数字。**图示一:
现在进行第二步,依次将方框中的数依次取出。如图十二所示:
第二轮是看十位上,十位上是哪一个数我们就将这个数放在相应的方框中,如果十位上没有数,那么就放在0方框中。如下图所示:
首先我们先拿到刚刚初步排序好的那组数据,如下图:
然后依次将数组中的元素放进相应的方框中,根据十位来选择方框。如下图所示:
然后再从方框中依次的取出所有元素。如下图所示:
在排序中需要注意的是,数组中的最大数有多少位就需要多少轮比较。例如上图中的比较,因为最大数只有两位,所以进行了两轮比较。比较后得到有序的排列组合。
代码图示:
源码+注释展示:
//基数排序:通过数组元素最大的多少来确定排序的轮数,利用分配再收集的方式进行排序
public static void main(String[] args) {
int[] arr = {15,12,23,32,29,25,18,17,21,22,33,26,25,35};
//获取数组中的最大值
// int max = getMax(arr); //找出数组元素中的最大值
//基数排序
sortArray(arr);//调用基数排序的方法
System.out.println(Arrays.toString(arr));//输出排序后的数组
}
private static void sortArray(int[] arr) {//定义基数排序的方法
//定义图示中临时存放数组元素的十个位置
int[][] tempArray = new int[10][arr.length];//10表示的是临时存放数组元素的十个位置,后面arr.length表示的是放如临时存储数组中的元素个数
int[] counts= new int[10];//定义统计数组
int max = getMax(arr);
int len = String.valueOf(max).length();//将最大值传进去,计算最大值的长度,确定了轮次
//循环轮次
for (int i = 0,n = 1; i < arr.length; i++,n*=10) {
for (int j = 0; j < arr.length; j++) {
//获取每个位上面的数字,放入对应的临时存储区
int wei = arr[j]/n%10;//n是位上面变化的值
tempArray[wei][counts[wei]++]=arr[j];//在这个临时数组中,二维表示的是位与该数出现的次数
}
//取出临时区中存放的数组
int index = 0;
for (int k = 0; k < counts.length; k++) {
if (counts[k]!=0) {
for (int h = 0; h < counts[k]; h++) {
//从临时存放区取出元素,放回原数组的容器中
arr[index] = tempArray[k][h];
index++;
}
counts[k] = 0;//清除上一次统计的元素
}
}
}
}
private static int getMax(int[] arr) {//定义获取最大值的方法,返回一个最值,确定它有多少位
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i]>max) {
}
}
return max;
}