SOLVED: опубликовано в конце этого комментария.Быстрый алгоритм, вызывающий переполнение стека
Я продолжаю получать эту ошибку, и я не могу найти объяснения, почему это происходит.
Exception in thread "main" java.lang.StackOverflowError
at java.util.Random.nextDouble(Random.java:444)
at java.lang.Math.random(Math.java:716)
at assignment6quickSort.M6.qsAlgorithm(M6.java:50)
at assignment6quickSort.M6.qsAlgorithm(M6.java:60)
at assignment6quickSort.M6.qsAlgorithm(M6.java:60)
at assignment6quickSort.M6.qsAlgorithm(M6.java:60)
Я как сумасшедший прибегая к помощи и, кажется, никто не имел такую же проблему, или я к глупы, чтобы искать правильные вещи (совершенно возможно).
В любом случае, я создаю случайные числа, чтобы найти номер сводки для общего quickSort, и пару часов назад он работал несколько раз, но теперь я получаю эту ошибку каждый раз.
Пожалуйста, я так расстроен ... Хе-хе! Что я делаю неправильно? Как это может вызвать переполнение?
вот мой код ...
package assignment6quickSort;
import java.util.ArrayList;
import java.util.List;
import java.util.Comparator;
public class M6 {
static M6Comparator<Integer> comp = new M6Comparator<Integer>();
static Integer[] array = new Integer[20];
static ArrayList qsSorted = new ArrayList();
public static void main (String[] args) {
for (int i = 0; i < array.length; i++) {
array[i] = (int)(50 * Math.random());
}
for (int i: array) {
System.out.print(i + ", ");
}
quickSort(array, comp);
System.out.println("\n");
for (Object i: qsSorted) {
System.out.print(i + ", ");
}
}
static <T> void quickSort(T[] a, Comparator<? super T> comp) {
ArrayList<T> temp = new ArrayList<T>();
for (int i = 0; i < a.length; i++) {
temp.add(a[i]);
}
qsSorted = qsAlgorithm(temp, comp);
}
static <T> ArrayList<T> qsAlgorithm(ArrayList<T> a, Comparator<? super T> comp) {
ArrayList<T> L = new ArrayList<T>();
ArrayList<T> G = new ArrayList<T>();
if (a.size() <= 1)
return a;
int pivot = (int)Math.random() * a.size();
T pivotValue = a.get(pivot);
for (int i = 0; i < a.size(); i++) {
if (comp.compare(a.get(i), pivotValue) == -1 || comp.compare(a.get(i), pivotValue) == 0) {
L.add(a.get(i));
} else {
G.add(a.get(i));
}
}
L = qsAlgorithm(L, comp);
G = qsAlgorithm(G, comp);
L.addAll(G);
return L;
}
}
Кроме того, здесь мой компаратор:
package assignment6quickSort;
import java.util.Comparator;
public class M6Comparator<E> implements Comparator<E> {
public int compare(E original, E other) {
return((Comparable<E>)original).compareTo(other);
}
}
### РЕШЕНИЕ ###
По-видимому, классическое рекурсивное переполнение ошибка. Спасибо за помощь @pst и @Marcin! Вот пересмотр qsAlgorithm() метод:
static <T> ArrayList<T> qsAlgorithm(ArrayList<T> a, Comparator<? super T> comp) {
ArrayList<T> L = new ArrayList<T>();
ArrayList<T> P = new ArrayList<T>();
ArrayList<T> G = new ArrayList<T>();
if (a.size() <= 1)
return a;
int pivot = (int)Math.random() * a.size();
T pivotValue = a.get(pivot);
for (int i = 0; i < a.size(); i++) {
int v = comp.compare(a.get(i), pivotValue);
if (v == -1) {
L.add(a.get(i));
} else if (v == 0) {
P.add(a.get(i));
} else {
G.add(a.get(i));
}
}
return concatenate(qsAlgorithm(L, comp), P, qsAlgorithm(G, comp));
}
static <T> ArrayList<T> concatenate(ArrayList<T> a, ArrayList<T> p, ArrayList<T> b) {
a.addAll(p);
a.addAll(b);
return a;
}
Вы уверены, что '((Сопоставимые) оригинал) .compareTo (другой);' не называет себя? –
dasblinkenlight
Нет ... Я совсем не уверен. Не могу сказать, что я полностью понимаю компаратор и дженерики. Итак ... Это называется само собой? –
На втором взгляде нет, это не похоже на вызов самому себе. Ничего! :) – dasblinkenlight