【发布时间】:2018-02-09 18:46:29
【问题描述】:
我正在尝试使用 分而治之的技术来实现 Quicksort。我在递归调用中遇到堆栈溢出错误。这是我的代码:
public static void main(String[] args) {
ArrayList<Integer> unsorted = new ArrayList<Integer>();
unsorted.add(23);
unsorted.add(5);
unsorted.add(1);
unsorted.add(-8);
unsorted.add(101);
unsorted.add(21);
unsorted.add(10);
unsorted.add(10);
unsorted.add(0);
unsorted.add(50);
ArrayList<Integer> sorted = Quicksort(unsorted);
System.out.println(sorted.toString());
}
public static ArrayList<Integer> Quicksort(ArrayList<Integer> unsorted) {
if (unsorted.size() <= 1)
return unsorted;
ArrayList<Integer> less = new ArrayList<Integer>();
ArrayList<Integer> more = new ArrayList<Integer>();
int pivotindex = unsorted.size()/2;
for (int i = 0; i < unsorted.size(); i++) {
if (unsorted.get(i) < unsorted.get(pivotindex))
less.add(unsorted.get(i));
else
more.add(unsorted.get(i));
}
ArrayList<Integer> sorted = Quicksort(less);
sorted.add(unsorted.get(pivotindex));
sorted.addAll(Quicksort(more));
return sorted;
}
我希望它使用ArrayLists 来实现。谁能指出我错在哪里?
非常感谢。
【问题讨论】:
-
事实上,任何等于枢轴的值(包括枢轴本身)都会添加到
more列表中。 -
错误似乎在于您在每次运行该方法时都添加了
pivotindex的副本。当你遍历 unsorted 时,没有检查值是否等于 pivotindex,因此它被添加到more数组列表中。然后你在sorted.add(unsorted.get(pivotindex))再次添加它,这样数组就会永远增长,这会导致你的 stackoverflow 错误。 -
在 for 循环中,您将枢轴索引处的元素与其自身进行比较,并最终将其作为更少或更多部分添加到排序列表中,并作为枢轴索引处的元素。因此,在每次递归调用时,您都在增加列表的大小,并且调用永远不会结束
-
using ArrayList如果这是CodeReview,我会指出您仍然应该针对接口而不是类进行编程:声明unsorted、less和moreList<Comparable>(甚至Collection<>,如果您不坚持从中间进行枢轴 - 这提醒我:使用局部变量作为枢轴,而不是它的索引)。使用对Collections 的大小进行合理估计的构造函数。
标签: java algorithm sorting quicksort