编写QuickSort算法时索引超出范围异常

时间:2015-02-07 14:33:45

标签: java quicksort

我正在编写快速排序算法的修改版本,即使我的ArrayList输入中包含元素,我也会得到索引超出范围的异常。

希望有人可以告诉我哪里出错......

以下是错误代码:

 Exception in thread "main" java.lang.IndexOutOfBoundsException: Index:
 4, Size: 4 at java.util.ArrayList.rangeCheck(ArrayList.java:635)   at> java.util.ArrayList.get(ArrayList.java:411)     at
 Lab4.quickSort(Lab4.java:36)   at Lab4.main(Lab4.java:113)

以下是我目前正在使用的代码:

public void quickSort(ArrayList<Integer> S){
    if(S.size() <= 1) return;

    int middle = (S.size() - 1) / 2;
    int pivot = S.get(middle);
    ArrayList<Integer> L = new ArrayList<Integer>(); //less
    ArrayList<Integer> E = new ArrayList<Integer>(); //equal
    ArrayList<Integer> G = new ArrayList<Integer>(); //greater

    int i = 0;
    while(!S.isEmpty()) {
        int next = S.get(i);
        if(next == pivot) E.add(next);
        else if(next > pivot) G.add(next);
        else if(next < pivot) L.add(next);
        i++;
    }

    quickSort(L);
    quickSort(G);

    S.addAll(L);
    S.addAll(E);
    S.addAll(G);
}

我目前用来测试此方法的ArrayList如下(想想你可能还需要这个部分):

ArrayList<Integer> arr2 = new ArrayList<Integer>();
arr2.add(3);
arr2.add(1);
arr2.add(6);
arr2.add(5);
sort.quickSort(arr2);
System.out.println("\n\nQuickSort (should be sorted): ");
printIntArrayList(arr2);

5 个答案:

答案 0 :(得分:1)

如果S包含值d.isEmpty(),则永远不会返回false。所以你在无限循环中运行。如果我使用S.size()函数,ArrayIndexOutOfBoundException我会更大get()

变化:

while(!S.isEmpty()) {

要:

while (i<S.size()) {

答案 1 :(得分:0)

问题在于此代码:

int i = 0;
while(!S.isEmpty()) {
    int next = S.get(i);
    if(next == pivot) E.add(next);
    else if(next > pivot) G.add(next);
    else if(next < pivot) L.add(next);
    i++;
}

从S开始,您不会移除元素,因此您将满足条件。每次迭代时,你都会增加i值,当你尝试读取第n + 1个元素时,你会得到异常。

您可能需要检查绑定和循环,直到那时(类似while (i<S.size()))?

答案 2 :(得分:0)

问题在于这个循环

int i = 0;
    while(!S.isEmpty()) {
        int next = S.get(i);
        if(next == pivot) E.add(next);
        else if(next > pivot) G.add(next);
        else if(next < pivot) L.add(next);
        i++;
    }

变量&#39; i&#39;在没有任何限制的情况下递增,您必须注意限制它增加多少,并且您的while循环不会因为您没有从中删除任何内容而中断

答案 3 :(得分:0)

这里的问题是你的S永远不会是空的,ArrayList的fonction get只返回值而不去除它,你应该做的是改变你的状态:while(i<S.size()))这也不是最好的在List上循环的方法,你可能想要迭代List:for (Integer x : S)并使用x ase你的元素。

答案 4 :(得分:0)

你的问题在于你的while循环。你调用!S.isEmpty()作为你的布尔表达式,然后遍历S.这里的错误是S永远不会为空,所以你的方法一旦到达列表的末尾就会超出界限。相反,请尝试检查列表是否包含下一个项目。我建议在循环结束时添加以下内容:

if(S.get(i+1) == null){
return;
}