我正在嘗試執行快速排序使用分而治之技術。我得到的遞歸一個堆棧溢出錯誤調用。這裏是我的代碼:快速排序分而治之
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'列表中。 – litelite
錯誤似乎在於你在方法的每次運行中添加'pivotindex'的副本。當你迭代未排序時,不檢查該值是否等於pivotindex,因此它被添加到'more'數組列表中。然後你在'sorted.add(unsorted.get(pivotindex))'處再次添加它,所以數組永遠長大,這會導致你的stackoverflow錯誤。 – gimg1
在for循環中,您要比較樞軸索引處的元素與其自身,並最終將其添加到排序列表中作爲更少或更多節,AND作爲樞軸索引處的元素。爲此,在每次遞歸調用,您都加大了列表的大小,並調用永遠不會結束 –