Java 编写快速排序算法时出现索引越界异常
我目前正在编写一个快速排序算法的修改版本,我得到了一个索引越界异常,即使我的ArrayList输入中有元素 希望有人能告诉我哪里出了问题 以下是错误代码: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
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(iifS
包含一个值d.isEmpty()
永远不会返回false。因此,您在一个无限循环中运行。如果我将S.size()
变大,如果使用get()
函数,您将得到一个ArrayIndexOutOfBoundException
更改:
while(!S.isEmpty()) {
致:
while(iifS
包含一个值d.isEmpty()
永远不会返回false。因此,您在一个无限循环中运行。如果我将S.size()
变大,如果使用get()
函数,您将得到一个ArrayIndexOutOfBoundException
更改:
while(!S.isEmpty()) {
致:
while(iifS
包含一个值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