基数排序思路:首先按照个位的大小进行一次排序,十位的大小进行一次排序,知道所有的位数均遍历完成。代码中详细写出
初级菜鸟,如果问题望指出,多多沟通,有利于成长。
public class RadixSort {
public static void main(String[] args) {
int[] arr = new int[] { 111, 110, 22, 21, 7, 9, 1 };
System.out.println("基数排序前为:");
for (int t : arr) {
System.out.print(t + " ");
}
System.out.println();
// 3是数组中最长的数据的长度,也可以通过克隆一个arr数组,排序求出这个最长数组的长度,或者转换成字符串比较
radixSort(arr, 3);
}
private static void radixSort(int[] arr, int d) {
for (int i = 0; i < d; i++) {
arr = countingSort(arr, i);
// 打印
print(arr, i + 1, d);
}
}
// 排序
private static int[] countingSort(int[] arr, int expIndex) {
int k = 9;
// 存放排序后的数组
int[] arrSort = new int[arr.length];
// 记录数组中0-9中每一位的个数
int[] num = new int[10];
// 取数组中每一位数是多少
for (int i = 0; i < arr.length; i++) {
int d = getBitData(arr[i], expIndex);
num[d]++;
}
for (int i = 1; i <= k; i++) {
/*
* c数组记录数组中0-9的个数,下面这句话的意思是:说不一定清楚举个例子
* 假如数组得到的数据是:1,3,1,0,0,0,0,1,0,1,末尾是0的个数1个,末尾是1的个数是3个, 末尾是2的个数为1等等,
*/
num[i] += num[i - 1];
/*
* 得到的结果是:1,4,5,5,5,5,5,6,6,7 末尾小于等0的个数是1,末尾小于等2的个数是4等等
*/
}
/*
* 找到数字排序后相应的位置:例如9,在数组b中的位置,c[9]=7,代表小于等与9的有7个包括9在内有七个,
* 所以9应该在数组的第七个位置,数组是从0开始的,在b中写出9对应的位置,已经排序好了一个数,c数组中小于等于9的自然就少了一个
*/
for (int i = arr.length - 1; i >= 0; i--) {
int d = getBitData(arr[i], expIndex);
arrSort[num[d] - 1] = arr[i];// C[d]-1 就代表小于等于元素d的元素个数,就是d在B的位置
num[d]--;
}
return arrSort;
}
/*
* 获取数字指定位的数字 取各位直接取余10就可以了,取十位,先取整也就是去掉个位,再取余10 111:取个位 =111%10=1
* ,111取十位:111/10=11,11%10=1十位数字
*/
private static int getBitData(int data, int expIndex) {
while (data != 0 && expIndex > 0) {
data /= 10;
expIndex--;
}
return data % 10;
}
// 打印
static void print(int[] arr, int k, int d) {
if (k == d)
System.out.println("最终排序结果为:");
else
System.out.println("按第" + k + "位排序后,结果为:");
for (int t : arr) {
System.out.print(t + " ");
}
System.out.println();
}
}
参考地址:http://www.acmerblog.com/radix-sorting-5601.html