思路:基数排序是一种不用通过数的比较的一种排序方法。将要排序的元素分配至某些“桶”中。先定义一个数组T有10个 分别代表0-9的数字的桶 ,假定现在数组A内容为 7,4,2,2,1,5,8(暂用个位数便于理解),6, 吧数组内容对应到桶中的0-9() ,有一个对应的值 桶数值+1;则对应后数组T中的数据为【0,1,2,0,1,1,0,1,1,0】在吧数组每个等于前面数组的和 结算后 数组T变为【0,1,3,3,4,4,5,6,7,7】。在把A数组内容,从后到前取出,把取出的值座位T数组的下标,取出数组T中的值 该值减一 作为下标 这A数组取出的值就存于新数组的该下标处。十位百位数时,有值取值,没值为0.(代码有详细注释帮助理解)
详细代码:
package rank;
public class BaseRank {// 基数排序
public static void main(String[] args) {
int[] array = { 15, 3, 7, 32, 18, 1, 9 };
array = sort.sort(array);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
}
}
class sort {
public static int[] sort(int[] array) {
int[] pail = new int[10];
int[] newArray = new int[array.length];
int maxdigit = getMaxValueLength(array);// 获取最大的位数
for (int base = 1; base <= maxdigit; base++) {// 根据位数进行主循环 默认个位数开始
for (int i = 0; i < array.length; i++) {
int digit = getDigit(array[i], base);
pail[digit] = pail[digit] + 1;// 吧内容放到对应的桶中+1
}
for (int j = 1; j < 10; j++) {
pail[j] = pail[j] + pail[j - 1];// 将桶中的数据进行增加 后面=本身+前面内容
}
for (int number = array.length - 1; number >= 0; number--) {
int pailIndex = getDigit(array[number], base);// 取出数组最后一个数的位数值(个,十,百)
newArray[pail[pailIndex] - 1] = array[number];// 吧pail数组中下标为pailIndex的值-1就是该值在新数组中的下标
pail[pailIndex] = pail[pailIndex] - 1;// 下标对应值 取出后 值减一保证重复数字进来
}
for (int a = 0; a < array.length; a++) {// 吧内容放回 原先数组 ,避免再次循环报错
array[a] = newArray[a];
}
pail = new int[10];// 初始化桶数组
}
return array;
}
// 获取数组中的最大值的位数
private static int getMaxValueLength(int[] originList) {
int max = originList[0];
for (int i = 1; i < originList.length; i++) {
if (originList[i] > max) {
max = originList[i];
}
}
return (max + "").length();
}
// 第一个参数为底数,第二个为 几次方
public static int getDigit(int number, int base) {
int baseNum = (int) Math.pow(10, (base - 1));
return (number / baseNum) % 10;
}
}