在Java中实现quicksort时的无限循环/递归

|| 我正在尝试在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)
    
已邀请:
问题是您将数据透视元素本身添加到“'less \'列表中,因此基本情况永远不会终止。 例: 您使用算法对列表[0,0]进行排序。枢轴元素是...0。您的算法生成的\'less \'列表再次为[0,0],然后进入无限循环。     
您不会从较小/较大的子列表中排除数据透视表-实际上,您明确将其包含在子列表集中。我怀疑这意味着您在很多情况下都会陷入无限排序的两个列表。您需要将数据透视表从次要子列表中排除。     
您不能确保对列表进行分区,以使较大的列表的大小减少1个或更多,而较小的列表的大小减少1个或更多。 在某个时候,如果枢轴是列表中最大的元素,则所有内容都将进入\“ less \”列表。 当您调用它时,同一件事将再次发生。     

要回复问题请先登录注册