0
這是一個基數/桶排序混合,硬編碼爲9位數字。我的快速排序程序快兩倍,可以排序10米數字。我已經驗證了輸出是正確的,但速度很慢。爲什麼我的排序程序太慢? (基數/桶排序java)
代碼:
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位數字,你有大約'29'的'w'。 'log(10000000)= 7',所以比較次數減少了大約4倍。 – user2478398