我正在尝试使用ArrayList实现快速排序算法,但似乎无法使其正常工作。它给我在sort()函数中的递归返回调用时出错。请帮忙!
这是我得到的错误:线程“main”中的异常java.lang.StackOverflowError
public static void main(String[] args) {
List<Integer> l = new ArrayList<Integer>();
l.add(10); l.add(7); l.add(13); l.add(22); l.add(9);
//l.get(2);
System.out.println(sort(l));
}
public static List<Integer> sort(List<Integer> l) {
if (l.size() <= 1) {
return l;
}
int pivot = l.get(0);
List<Integer> left = new ArrayList<Integer>();
List<Integer> right = new ArrayList<Integer>();
for (int i = 0; i < l.size(); i++) {
if (l.get(i) < pivot) {
left.add(l.get(i));
//System.out.println(left);
} else {
right.add(l.get(i));
}
}
return join(sort(left), sort(right), pivot);
}
public static List<Integer> join(List<Integer> left, List<Integer> right, int pivot) {
List<Integer> l = new ArrayList<Integer>();
for (int i = 0; i < left.size(); i++) {
l.add(left.get(i));
}
l.add(pivot);
for (int i = l.size(); i < right.size(); i++) {
l.add(right.get(i));
}
return l;
}
}
答案 0 :(得分:3)
问题可能在这里:
您选择您的支点:
l.get(0);
然后再次添加您的支点:
int i = 0; i < l.size(); i++
从零开始!
所以改成它从1开始:
int i = 1; i < l.size(); i++
修改强>
另一个错误在于你的join()
方法 - 你必须从两个arraylists的0开始:
for (int i = 0; i < right.size(); i++) {
l.add(right.get(i));
}
答案 1 :(得分:0)
如果选择最小元素作为支点,请考虑会发生什么。两个子列表中的一个将为空,另一个将包含整个原始列表,从而导致无限递归。