提问人:Dhairya Gupta 提问时间:9/17/2023 更新时间:9/17/2023 访问量:27
array 索引越界 java 中的合并排序异常 [duplicate]
array Index Out Of Bounds Exception in merge sort in java [duplicate]
问:
我在 java 中为合并排序编写了这段代码,我尝试仅使用一个辅助数组来使用合并排序。但它会导致数组越界异常。请帮我修复带有 1 个辅助数组的 mergeSort 代码。
public static void mergeSort(int arr[], int s, int e){
if(s < e){
int mid = s + (e-s)/2;
mergeSort(arr, s, mid);
mergeSort(arr, mid+1, e);
merge(arr, s, mid, e);
}
}
public static void merge(int arr[], int s, int mid, int e){
int arr2[] = new int[arr.length];
for(int i = 0;i <= e; i++){
arr2[i] = arr[i];
}
int i = 0, j = mid+1, k = s;
while(i < mid+1 && j < e+1){
if(arr2[i] < arr2[j]) arr[k++] = arr2[i++];
else arr[k++] = arr2[j++];
}
while(i < mid+1) arr[k++] = arr2[i++];
while(j < e+1) arr[k++] = arr2[j++];
}
答:
1赞
JJY9
9/17/2023
#1
您的代码中存在一个微妙的错误。在 merge 方法中,你使用不同的索引来迭代 arr2 和 arr。这是 ArrayIndexOutOfBoundsException 的主要原因。
若要修复代码,请注意以下几点:
从 arr 复制到 arr2 时,您应该只将元素从 s 复制到 e,而不是整个数组。 对于 arr2,索引 i 和 j 应分别从 s 和 mid + 1 开始。
下面是合并方法的更正版本:
public static void merge(int arr[], int s, int mid, int e){
int arr2[] = new int[arr.length];
for(int i = s; i <= e; i++){
arr2[i] = arr[i];
}
int i = s, j = mid + 1, k = s;
while(i <= mid && j <= e){
if(arr2[i] < arr2[j]) arr[k++] = arr2[i++];
else arr[k++] = arr2[j++];
}
while(i <= mid) arr[k++] = arr2[i++];
while(j <= e) arr[k++] = arr2[j++];
}
评论