Java 编写快速排序算法时出现索引越界异常

Java 编写快速排序算法时出现索引越界异常,java,quicksort,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(A

我目前正在编写一个快速排序算法的修改版本,我得到了一个索引越界异常,即使我的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);
}
public void快速排序(ArrayList S){
如果(S.size()枢轴)G.add(下一步);
如果(下一个<枢轴)L.add(下一个);
i++;
}
快速排序(L);
快速排序(G);
S.addAll(L);
S.addAll(E);
S.addAll(G);
}
我目前用于测试此方法的ArrayList如下所示(我想您可能也需要此部分):

ArrayList arr2=new ArrayList();
2.加入第(3)款;
2.加入第(1)款;
2.加入(6);
2.加入(5);
排序。快速排序(arr2);
System.out.println(“\n\nQuickSort(应排序):”;
printIntArrayList(arr2);

如果
S
包含值
d.isEmpty()
从不返回false。所以你在一个无限循环中运行。如果我将增大
S.size()

更改:

while(!S.isEmpty()) {
致:


while(iif
S
包含一个值
d.isEmpty()
永远不会返回false。因此,您在一个无限循环中运行。如果我将
S.size()
变大,如果使用
get()
函数,您将得到一个
ArrayIndexOutOfBoundException

更改:

while(!S.isEmpty()) {
致:


while(iif
S
包含一个值
d.isEmpty()
永远不会返回false。因此,您在一个无限循环中运行。如果我将
S.size()
变大,如果使用
get()
函数,您将得到一个
ArrayIndexOutOfBoundException

更改:

while(!S.isEmpty()) {
致:


while(iif
S
包含一个值
d.isEmpty()
永远不会返回false。因此,您在一个无限循环中运行。如果我将
S.size()
变大,如果使用
get()
函数,您将得到一个
ArrayIndexOutOfBoundException

更改:

while(!S.isEmpty()) {
致:


while(i问题在于此代码:

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++;
}
inti=0;
而(!S.isEmpty()){
int next=S.get(i);
如果(下一步==枢轴)E.add(下一步);
如果(下一步>枢轴)G.add(下一步);
如果(下一个<枢轴)L.add(下一个);
i++;
}
从S开始,您没有删除元素,因此您将满足条件。每次迭代,您都会增加i值,当您尝试读取n+1个元素时,您会得到异常


在此之前,您可能需要检查绑定和循环(类似
while(i问题在于此代码):

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++;
}
inti=0;
而(!S.isEmpty()){
int next=S.get(i);
如果(下一步==枢轴)E.add(下一步);
如果(下一步>枢轴)G.add(下一步);
如果(下一个<枢轴)L.add(下一个);
i++;
}
从S开始,您没有删除元素,因此您将满足条件。每次迭代,您都会增加i值,当您尝试读取n+1个元素时,您会得到异常


在此之前,您可能需要检查绑定和循环(类似
while(i问题在于此代码):

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++;
}
inti=0;
而(!S.isEmpty()){
int next=S.get(i);
如果(下一步==枢轴)E.add(下一步);
如果(下一步>枢轴)G.add(下一步);
如果(下一个<枢轴)L.add(下一个);
i++;
}
从S开始,您没有删除元素,因此您将满足条件。每次迭代,您都会增加i值,当您尝试读取n+1个元素时,您会得到异常


在此之前,您可能需要检查绑定和循环(类似
while(i问题在于此代码):

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++;
}
inti=0;
而(!S.isEmpty()){
int next=S.get(i);
如果(下一步==枢轴)E.add(下一步);
如果(下一步>枢轴)G.add(下一步);
如果(下一个<枢轴)L.add(下一个);
i++;
}
从S开始,您没有删除元素,因此您将满足条件。每次迭代,您都会增加i值,当您尝试读取n+1个元素时,您会得到异常


在此之前,您可能需要检查绑定和循环(类似
while(i问题在于此循环)

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++;
    }
inti=0;
而(!S.isEmpty()){
int next=S.get(i);
如果(下一步==枢轴)E.add(下一步);
如果(下一步>枢轴)G.add(下一步);
如果(下一个<枢轴)L.add(下一个);
i++;
}

变量“i”的增量没有任何限制,您必须注意限制它的增量,并且while循环不会中断,因为您没有从中删除任何内容

问题在于此循环

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++;
    }
inti=0;
而(!S.isEmpty()){
int next=S.get(i);
如果(下一步==枢轴)E.add(下一步);
如果(下一步>枢轴)G.add(下一步);
如果(下一个<枢轴)L.add(下一个);
i++;
}

变量“i”的增量没有任何限制,您必须注意限制它的增量,并且while循环不会中断,因为您没有从中删除任何内容

问题在于此循环

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++;
    }
inti=0;
而(!S.isEmpty()){
int next=S.get(i);
如果(下一步==枢轴)E.add(下一步);
如果(下一步>枢轴)G.add(下一步);
如果(下一个<枢轴)L.add(下一个);
i++;
}

变量“i”的增量没有任何限制,您必须注意限制它的增量,并且while循环不会中断,因为您没有从中删除任何内容

问题在于此循环

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++;
    }
inti=0;
而(!S.isEmpty()){
int next=S.get(i);
如果(下一步==枢轴)E.add(下一步);
如果(下一步>枢轴)G.add(下一步);
如果(下一个<枢轴)L.add(下一个);
i++;
}
变量“i”的增量没有任何限制,您必须注意限制它的增量,并且您的while循环不会中断,因为您没有删除任何i