算法思想
思想:
通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用。
=>将所有的待比较数值统一为同样的数位长度,数位较短的数前面补0。然后,从最低位开始,依次进行排序(每一位进行一次,一共有多少位,就进行多少次排序)。
基数排序的实现思路:
-
用于排序过程的“桶”
- 假设用于排序的数均为正整数,那么在这里设置桶的个数为10。又因为每个桶,实际上也是一个一维数组。
所以,定义一个二维数组,来实现排序过程中对于“桶”的要求:
int[][] bucket = new int[10][arr.length]; - 在每趟排序过程中,每个桶中存储的有效元素的个数,也是需要记录的。
可以定义一个一位数组,来记录每个桶中所存储的有效元素的个数:
int[] bucketElementCounts = new int[bucket.length];
- 假设用于排序的数均为正整数,那么在这里设置桶的个数为10。又因为每个桶,实际上也是一个一维数组。
-
确定对arr[]中的元素实现排序,一共需要进行排序的趟数:
- 在基数排序中,需要进行的排序的趟数 == arr[]中最大的数 的位数
-
排序过程的实现:
- 每趟排序过程主要分为两步:
1)将元素依据 该趟排序所参照的数位 上的值,放入到对应的桶中
2)按照放入桶中的顺序,从桶中依次取出对应元素的值,放回到arr[]中
- 每趟排序过程主要分为两步:
算法实现
//实现基数排序
public static void radixSort(int[] arr) {
//定义一个二维数组,来实现排序过程中对于“桶”的要求
int[][] bucket = new int[10][arr.length];
//定义一个一位数组,来记录每个桶中所存储的有效元素的个数:
int[] bucketElementCounts = new int[bucket.length];
//确定对arr[]中的元素实现排序,一共需要进行排序的趟数
//先找到arr[]中最大的数
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if(arr[i] > max) {
max = arr[i];
}
}
//确定最大的数的位数(巧妙)
int maxLength = (max + "").length();
// System.out.println("max="+max+",max.length="+maxLength);
//排序过程的实现:
int temp;//记录该数 在相应位上的值
for (int i = 0,n = 1; i < maxLength; i++,n*=10) {//一共需要进行排序的趟数
//在每趟排序中,需要先将元素依据 该趟排序所参照的数位 上的值,放入到对应的桶中
for (int j = 0; j < arr.length; j++) {
//获取该位上的值
temp = arr[j] / n % 10;
// System.out.println(temp);
//将该值放入到相应桶中的相应位置
bucket[temp][bucketElementCounts[temp]] = arr[j];
bucketElementCounts[temp]++;//更新该值(记录的是下次放入该桶中的元素,应该在的存储位置的下标值)
}
//对应的arr[]中下标值
int index = 0;
//从桶中取出相应的值,并按照顺序放回到arr[]中去
for (int k = 0; k < bucket.length; k++) {//对应第k个桶的情况
if(bucketElementCounts[k] > 0) {//该桶中放置的有元素(桶不为空,才有从中读取元素的必要)
for (int l = 0; l < bucketElementCounts[k]; l++) {
arr[index] = bucket[k][l];
index++;//更新该值(记录的是下次放入arr[]中的元素,应该在的存储位置的下标值)
}
//将bucketElementCounts[]中对应的值清0(对应的桶中存储的元素数目清0)
bucketElementCounts[k] = 0;
}
//如果该桶中本来就没有元素,也不存在读出元素之后,进行置空的操作
}
}
}
行百里者半九十!