Это гибридный гибридный гибрид, который жестко закодирован для 9-значных чисел. Моя программа быстрой сортировки более чем вдвое быстрее, чем сортировать 10-миллиметровые числа. Я проверял, что результат правильный, он просто медленный.Почему моя программа сортировки так медленно? (сортировка по методу radix/bucket в 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))», а Radix - «O (wn)». Для 9-значных чисел у вас 'w' около' 29'. 'log (10000000) = 7', поэтому происходит примерно в 4 раза меньшее количество сравнений. – user2478398