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

时间:2011-04-15 01:01:47

标签: java loops recursion 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)

3 个答案:

答案 0 :(得分:3)

问题是您将pivot元素本身添加到'less'列表中,因此基本情况永远不会终止。

示例 您使用算法对列表[0,0]进行排序。 pivot元素是...... 0.算法产生的'less'列表再次为[0,0],你进入无限循环。

答案 1 :(得分:1)

您不会从较少/较大的子列表中排除数据透视表 - 事实上,您明确将其包含在子列表集中。我怀疑这意味着你会遇到很多情况下无限排序的两个列表。您需要从较少的子列表中排除枢轴。

答案 2 :(得分:0)

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

在某些时候,如果枢轴是列表中最大的元素,那么所有内容都将转到“less”列表。

当你打电话时,同样的事情会再次发生。

相关问题