【发布时间】:2016-03-12 16:57:37
【问题描述】:
这是一个基数/桶排序混合,硬编码为 9 位数字。我的快速排序程序对 1000 万个数字进行排序的速度是原来的两倍多。我已经验证输出是正确的,只是速度很慢。
代码:
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
ArrayList<Integer> inputs = new ArrayList<>();
while (in.hasNext()) {
inputs.add(in.nextInt());
}
radixSort(inputs);
//System.out.print(toString(radixSort(inputs)));
}
public static ArrayList<Integer> radixSort(ArrayList<Integer> a) {
for (int i = 1; i <= 9; i++) {
a = bucketSort(a, i);
}
return a;
}
public static ArrayList<Integer> bucketSort(ArrayList<Integer> a, int index) {
// Creates buckets
ArrayList<ArrayList<Integer>> b = new ArrayList<ArrayList<Integer>>();
for (int i = 0; i < 10; i++) {
b.add(new ArrayList<Integer>());
}
// Sorts into buckets
for (int i = 0; i < a.size(); i++) {
b.get(key(a.get(i), index)).add(a.get(i));
}
// Concatenates buckets
ArrayList<Integer> c = new ArrayList<>();
for (int i = 0; i < b.size(); i++) {
c.addAll(b.get(i));
}
return c;
}
// Takes an integer and index and returns digit at index
public static int key(int num, int ind) {
int digit = num / (int)Math.pow(10, ind - 1);
digit = digit % 10;
return (int)digit;
}
public static String toString(ArrayList<Integer> a){
StringBuilder s = new StringBuilder();
for (int i = 0; i < a.size(); i++){
s.append(String.format("%09d\n", a.get(i)));
}
return s.toString();
}
【问题讨论】:
-
我还没有检查实现,但这似乎并没有什么不同。快速排序是
O(n log(n)),而基数是O(wn)。对于 9 位数字,您的w大约是29。log(10000000) = 7,因此进行的比较减少了大约 4 倍。
标签: java sorting radix-sort bucket-sort