[英]Infinite loop/recursion when implement quicksort in java
我正在嘗試在java中實現quicksort以計算所做的比較次數,但是我遇到了無限循環/遞歸調用情況,我無法弄清楚它來自何處。
通過調試我已經確定內部for循環運行多次,並且所有內容只輸入“less”子列表,然后對quicksort(less)進行遞歸調用
private ArrayList<Comparable> quickSort(ArrayList<Comparable> qList) {
ArrayList<Comparable> less = new ArrayList<Comparable>();
ArrayList<Comparable> greater = new ArrayList<Comparable>();
if (qList.size() <= 1)
return qList;
Comparable pivot = qList.get(qList.size() / 2);
for (int i = 0; i < qList.size(); i++) {
if ((qList.get(i).compareTo(pivot)) <= 0) {
comps++;
less.add(qList.get(i));
} else {
comps++;
greater.add(qList.get(i));
}
}
ArrayList<Comparable> toReturn = new ArrayList<Comparable>(
quickSort(less));
toReturn.add(pivot);
toReturn.addAll(quickSort(greater));
return toReturn;
}
如果我只使用大小為20的列表運行代碼,我會收到此錯誤
Exception in thread "main" java.lang.StackOverflowError
at java.util.Arrays.copyOf(Unknown Source)
at java.util.ArrayList.ensureCapacity(Unknown Source)
at java.util.ArrayList.add(Unknown Source)
at file.quickSort(CMSC351P1.thisClass:40)
at file.quickSort(CMSC351P1.thisClass:48)
問題是您將pivot元素本身添加到'less'列表中,因此基本情況永遠不會終止。
示例:使用算法對列表[0,0]進行排序。 pivot元素是... 0.算法產生的'less'列表再次為[0,0],並且您進入無限循環。
您不會從較少/較大的子列表中排除數據透視表 - 事實上,您明確將其包含在子列表集中。 我懷疑這意味着你會遇到很多情況下無限排序的兩個列表。 您需要從較少的子列表中排除樞軸。
您不能確保對列表進行分區,以使較大列表的大小減小1或更多,或者較小列表的大小減小1或更多。
在某些時候,如果pivot是列表中最大的元素,那么一切都將轉到“less”列表。
當你打電話時,同樣的事情會再次發生。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.