Мой код работает должным образом (насколько мне известно) до тех пор, пока размер моего входного массива (a.length
) не составит около 62 000, и тогда я последовательно получу StackOverFlowError
.Ранее я использовал 2 рекурсивных вызова для quicksort
(меньше и больше, чем пивот q
), а затем переключился на хвостовую рекурсию.Как вы можете видеть, я выбираю пивот в качестве значения в конце массива.Я знаю, что это не лучший способ выбора точки, но я все еще не должен видеть StackOverFlowError
с таким маленьким размером массива, верно?Что может быть причиной этого?Заранее спасибо!Вот мой код:
public static void quicksort(int[] a, int p, int r)
{
int q;
while (p < r)
{
q = partition(a, p, r);
quicksort(a, p, q - 1);
p = q + 1;
}
}
public static int partition(int[] a, int p, int r)
{
int j = p - 1;
int x = a[r];
for (int i = p; i < r; i++)
{
if (a[i] <= x)
{
j++;
swap(a, i, j);
}
}
j++;
swap(a, j, r);
return j;
}
private static void swap(int[] a, int i, int j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}