Я работаю над проблемой быстрой сортировки для массивов только целых чисел. Выбор сводки в этой подпрограмме всегда является первым элементом подмассива (как продиктовано проблемой), и в определенный момент я ожидал, что это вызовет StackOverflowError. Странно то, что он не работает для задач размером n = ~ 25000 ~ 404,300, но он работает для n гораздо больше, чем это. Даже когда я заполняю вход массива, он иногда работает при n = 10000, а иногда не работает.
Вот некоторые результаты, которые я получил (время в секундах):
10000: .077
20000: .282
~ 25 000 - ~ 404 300: SOE
405 000 - 3,169
410 000 - 1,632
450 000 - .098
500 000 - .059
5 000 000 - .634
10 000 000 - 1,373
100 000 000 - 18,613
Есть идеи, что могло бы вызвать это? Код ниже.
Заранее спасибо.
public static void main(String[] args) {
int arraySize = 1000000;
int[] a = new int[arraySize];
Random gen = new Random();
gen.setSeed(0);
a[0] = gen.nextInt(arraySize * 10);
for (int i = 1; i < arraySize; i++) {
a[i] = a[i - 1] + gen.nextInt(arraySize / 10);
}
private static void quickSort(int[] a, int lo, int hi) {
if (hi <= lo) return;
int j = partition(a, lo, hi);
quickSort(a, lo, j - 1);
quickSort(a, j + 1, hi);
}
private static int partition(int[] a, int lo, int hi) {
int i = lo, j = hi + 1;
int pivot = a[i];
while (true) {
while (a[++i] > pivot) if (i == hi) break;
while (pivot > a[--j]) if (j == lo) break;
if (i >= j) break;
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
int temp = a[lo];
a[lo] = a[j];
a[j] = temp;
return j;
}