什么是基数排序?
基数排序属于“分配式排序”,又称“桶排序”。顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法属于稳定性排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。
代码实现
package com.id.review;
public class Test007 {
public static void main(String[] args) {
int[] ints = {-1, -5555, -908, -9541, 1, 5, 91, 0, 0, 5, 42, 7, 5, 10, 1};
sort(ints);
for (int i : ints) {
System.out.print(i + " ");
}
}
public static void sort(int[] ints) {
//创建用于排序的桶
int[][] state = new int[19][ints.length];
//创建用于记录每次循环各桶中的数
int[] temp = new int[19];
//找出最大数
int max = ints[0];
for (int i = 0; i < ints.length; i++) {
if (ints[i] > max) {
max = ints[i];
}
}
//找出最小数
int min = ints[0];
for (int i = 0; i < ints.length; i++) {
if (ints[i] < min) {
min = ints[i];
}
}
//得到最大数位数
int maxWs;
if (max >= 0) {
maxWs = (max + "").length();
} else {
maxWs = (max + "").length() - 1;
}
//得到最小数位数
int minWs;
if (min >= 0) {
minWs = (min + "").length();
} else {
minWs = (min + "").length() - 1;
}
//得到最大位数
int wsMax = maxWs >= minWs ? maxWs : minWs;
int n = 1;
//对数组进行循环排序
for (int i = 0; i < wsMax; i++, n *= 10) {
for (int i1 = 0; i1 < ints.length; i1++) {
state[ints[i1] / n % 10 + 9][temp[ints[i1] / n % 10 + 9]++] = ints[i1];
}
int index = 0;
for (int s = 0; s < state.length; s++) {
if (temp[s] != 0) {
for (int j = 0; j < temp[s]; j++) {
ints[index] = state[s][j];
index++;
}
temp[s] = 0;
}
}
}
}
}