我正在制作一个程序,它接受一个整数数组并使用“气泡排序”对其进行排序(切换相邻的数字直到它的顺序。)我一直在试图弄清楚为什么我得到这个超出界限错误,但它对我来说仍然没有多大意义,因为数组对我来说仍然是一个非常新的概念。
public static boolean onePass(int[] a) {
boolean ordered = true;
for (int i = 0; i+1 < a.length; i++) {
if (a[i] < a[i+1]) {
ordered = false;
return ordered;
} }
return ordered;
}
public static void printArray(int[] b) {
for(int i = 0; i < b.length; i++){
System.out.println(i + " " + b[i]);
}
}
public static int[] bubbleSort(int[] unsorted) {
int[] a = unsorted;
boolean sorted = false;
for (int i = 0; sorted == true; i++) {
sorted = onePass(a);
if (i > a.length) {
i = 0;
}
if (a[i] < a[i+1] && i < a.length) {
swapElement(a, i, i + 1);
//System.out.println(i + " " + (i+1));
}
}
return a;
}
onePass方法应该检查它是否按顺序。
我得到:“线程中的异常”main“java.lang.ArrayIndexOutOfBoundsException:25” 在这一行:if(a [i]&lt; a [i + 1]&amp;&amp; i&lt; a.length)
很抱歉,如果这是一个非常愚蠢的问题 我在学习java的课程中,所以可能有一种更有效的方法来制作这个程序,但是到目前为止使用我们学到的东西,这是我能够理解和自己编写的。
编辑:我正在排序的数组在我用BufferedReader读取的文本文档中有25个数字(0-24)。
编辑2:找到一种更有效的冒泡排序方式,最后评论所有这些,但感谢您的帮助!
答案 0 :(得分:0)
您需要确保i + 1
不会越界。
在此处的此行,在访问i < a.length
之前执行a[i]
检查,同样,在尝试访问a[i+1]
之前添加检查:
if (i < a.length && /* check i+1 */ && a[i] < a[i+1])
由于这是作业,我会让你填写实际的代码。
答案 1 :(得分:0)
你超越了数组中的最后一个元素。
因为您正在检查i
是否不大于或等于长度,但a[i+1]
将使其等于长度,因为数组为0索引,它将在到达之后达到一个元素最后。
试试这个:
if (i >= a.length-1) {
i = 0;
}
else if (a[i] < a[i+1]) {
swapElement(a, i, i + 1);
System.out.println(i + " " + (i+1));
}
修改强>
您的第三行也有同样的问题:
for (int i = 0; i+1 < a.length; i++) {
应该是:
for (int i = 0; i+1 < a.length-1; i++) {
因为下一行:
if (a[i] < a[i+1]) {
<强> EDIT2 强>
当i
不大于或等于a.length
且a.length
为25时,i
将最多为24,当i
为24时a+1
将是25,超出范围。
答案 2 :(得分:0)
在相关专栏中,请尝试将其替换为:
a[i] < a[i+1] && i < a.length
使用:
i < a.length && a[i] < a[i+1]
在最后一次迭代时,您仍然可以尝试访问元素i+1
,然后再确保它小于数组的长度。所以在这种情况下,你得到一个java.lang.ArrayIndexOutOfBoundsException
。