方法名:
public static void radixSort(String[] a, int length) {}
1. 准备桶
ArrayList<String>[] buckets = new ArrayList[10];//[128]
for (int i = 0; i < buckets.length; i++) {
buckets[i] = new ArrayList<>();
}
// [128] —— 如果排序的字符串不仅包含数字字符,还包含英文字符,加减乘除等一些符号,范围在ASCII码之内(0~127)之间,可以把长度改成128,包含0~127。
2. 进行多轮按桶位排序
// 2. 进行多轮按位桶排序
for (int i = length - 1; i >= 0; i--) {
//将字符串放入合适的桶
// '0' -> 48
// '1' -> 49
for (String s : a) {
buckets[s.charAt(i) - '0'].add(s); //buckets[s.charAt(i)].add(s);
}
用charAt(i)取到的字符 减去 '0'或者48 可以得到字符索引位置
// buckets[s.charAt(i)].add(s); ——使用[128]时使用
3. 取出放在桶里的字符串,放回原始数组并打印
//重新取出排好序的字符串,放回原始数组
int k = 0;
for (ArrayList<String> bucket : buckets) {
for (String s : bucket) {
a[k++] = s;
}
bucket.clear();
}
System.out.println(Arrays.toString(a));
bucket.clear(); —— 使用完桶之后要清空桶里的数据
4. 测试
public static void main(String[] args) {
String[] phoneNumbers = new String[6];
phoneNumbers[0] = "15845236785";
phoneNumbers[1] = "15171425368";
phoneNumbers[2] = "13543486428";
phoneNumbers[3] = "13845385347";
phoneNumbers[4] = "13943548386";
phoneNumbers[5] = "15943779314";
RadixSort.radixSort(phoneNumbers, 11); //0~127
for (String phoneNumber : phoneNumbers) {
System.out.println(phoneNumber);
}
}
// 0~127 因为手机号是11位