簡體   English   中英

在java中實現快速排序時的無限循環/遞歸

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM