1基数排序不是可比较的排序。它没有比较对象。但是必须对所要排序的数据做一些限定。
2它将数组元素作为长度相等的字符串对待的。
3它不适合作为通用的排序算法。
4比如将所有的数字加0,使其长度相等。
5比如数字23变成字符串023,然后先根据末尾3,把数字放到新数与中。
2它将数组元素作为长度相等的字符串对待的。
3它不适合作为通用的排序算法。
4比如将所有的数字加0,使其长度相等。
5比如数字23变成字符串023,然后先根据末尾3,把数字放到新数与中。
末尾数字相同,则放在同一个位置的后面。依次再按照2,再按0进行排序。
public class Test {
public static void main(String[] args) {
int[] intArr = { 34, 565, 1, 4654, 4, 67, 9, 9, 9, 43539, 12, 89, 78, 7827 };
String[] strArr = new String[intArr.length];
int maxLen = convertStrArray(intArr, strArr);
String[] retStr = Arrays.copyOf(strArr, intArr.length);
for (int cnt = 0; cnt < maxLen; cnt++) {
// 注意:这里需要生成10个元素的数组
Vector<String>[] vector = new Vector[10];
for (int i = 0; i < strArr.length; i++) {
char ch = retStr[i].charAt(maxLen - cnt - 1);
int chInt = Integer.valueOf(String.valueOf(ch));
Vector<String> tmp = vector[chInt];
if (tmp == null) {
tmp = new Vector<String>();
}
tmp.add(String.valueOf(retStr[i]));
vector[chInt] = tmp;
}
int index = 0;
for (Vector<String> v : vector) {
if (v != null) {
for (String number : v) {
retStr[index++] = number;
}
}
}
}
for (int i = 0; i < retStr.length; i++) {
intArr[i] = Integer.valueOf(retStr[i]);
System.out.print(intArr[i] + " ");
}
}
/**
* 按数组中最大的数的长度,然后生成长度一致的字符串数组。
*/
private static int convertStrArray(int[] arr, String[] str) {
int maxLen = 0;
for (int i = 0; i < arr.length; i++) {
str[i] = String.valueOf(arr[i]);
maxLen = str[i].length() >= maxLen ? str[i].length() : maxLen;
}
for (int i = 0; i < str.length; i++) {
// 长度不够的数,在数的前面补0
if (str[i].length() < maxLen) {
int zeroCnt = maxLen - str[i].length();
String temp = "";
for (int j = 0; j < zeroCnt; j++) {
temp += "0";
}
str[i] = temp + str[i];
}
}
return maxLen;
}
}