我练习用java编写关于合并排序算法的代码。乍一看似乎不错,但“if”条件中有几个问题。
在我的代码中,首先我迭代原始数组以合并两个不同的子数组。所以我设一个条件,只要“i”小于或大于等于mid,Arr[low + i],即Arr中的原数组,就被赋值给arr_left [我]。当我运行代码时,出现索引越界的错误。
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 8 out of bounds for length 8
at baseproj/basetest.MergeSort.merge(MergeSort.java:24)
at baseproj/basetest.MergeSort.main(MergeSort.java:12)
我只是java初学者。因此,如果任何前辈能够解释为什么这是错误以及我如何解决它,我将非常感激。
以下是我的代码。然而,这并不是绝对完整的代码,它只是一段代码。
package sorting_algorithm;
import java.util.Arrays;
public class MergeSort {
public static void main(String[] args) {
int[] arr = {38, 27, 43, 10, 56, 27, 18, 32};
int low = 0;
int high = arr.length - 1;
int mid = high / 2;
merge(arr, low, mid, high);
}
public static void merge(int[] Arr, int low, int mid, int high) {
int[] arr_left = new int[mid - low + 1];
int[] arr_right = new int[high - mid];
for (int i = 0; i < Arr.length; i++) {
if (i <= mid) {
arr_left[i] = Arr[low + i];
}
else {
System.out.printf("i = %d , mid = %d%n", i, mid);
arr_right[i] = Arr[mid + 1 + i];
}
}
System.out.println(Arrays.toString(arr_left));
System.out.println(Arrays.toString(arr_right));
}
}
由于合并排序算法的本质,我试图通过让原始数组迭代并使用 if 条件正确分配给左数组和右数组,将原始数组划分为两个不同的子数组。
您可以使用调试工具调试您的代码,例如,这个在线工具https://www.onlinegdb.com/online_java_debugger,然后您将看到下面的异常,这意味着“
arr_right[i] = Arr[mid + 1 + i];
”引发了异常,因为此处 mid + 1 + i
等于 8。
线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException:索引 8 超出长度 8 的范围 在 Main.merge(Main.java:32) 在 Main.main(Main.java:18)