繁体   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