Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中实现快速排序时的无限循环/递归_Java_Loops_Recursion_Quicksort - Fatal编程技术网

在java中实现快速排序时的无限循环/递归

在java中实现快速排序时的无限循环/递归,java,loops,recursion,quicksort,Java,Loops,Recursion,Quicksort,我试图用java实现快速排序,以计算所做比较的数量,但我遇到了无限循环/递归调用的情况,我不太清楚它来自何处 通过调试,我确定内部for循环运行了多少次,所有内容都只输入到“less”子列表中,然后递归调用quicksort(less) 问题是您将pivot元素本身添加到“less”列表中,这样基本情况就永远不会终止 示例: 您可以使用算法对列表[0,0]进行排序。轴心元素是。。。0您的算法生成的“更少”列表再次是[0,0],您进入无限循环。您没有从更少/更大的子列表中排除轴心-事实上,您明确地

我试图用java实现快速排序,以计算所做比较的数量,但我遇到了无限循环/递归调用的情况,我不太清楚它来自何处

通过调试,我确定内部for循环运行了多少次,所有内容都只输入到“less”子列表中,然后递归调用quicksort(less)


问题是您将pivot元素本身添加到“less”列表中,这样基本情况就永远不会终止

示例:
您可以使用算法对列表[0,0]进行排序。轴心元素是。。。0您的算法生成的“更少”列表再次是[0,0],您进入无限循环。

您没有从更少/更大的子列表中排除轴心-事实上,您明确地将其包括在子列表集中。我怀疑这意味着在很多情况下,你会被无限排序的两个列表所困扰。您需要从less子列表中排除pivot。

您不能确保对列表进行分区,以使较大列表的大小减少1或更多,或使较小列表的大小减少1或更多

在某个时刻,如果pivot是列表中最大的元素,那么所有内容都将进入“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;

        }
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)