[英]index 4 is out of bounds for 4 length
package dsa450;
import java.util.*;
public class countInversion {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("Enter the size of Array");
int n=sc.nextInt();
int arr[]=new int[n];
System.out.println("Enter the size of Array");
for(int i=0;i<n;i++){
arr[i]=sc.nextInt();
}
int p=arr.length;
int temp[]=new int[n];
int ans=mergeSort(arr,temp,0,n-1);
System.out.println(ans);
}
static int mergeSort(int[] arr,int[]temp,int l,int r) {
int inv=0;
int mid;
if (l<r) {
mid=(l+r)/2;
inv+= mergeSort(arr,temp,l, mid);
inv+= mergeSort(arr,temp,mid+1,r);
inv+= merge(arr,temp,l,mid+1,r);
}
return inv;
}
private static int merge(int []arr,int []temp,int l,int mid,int r) {
int i=0;
int j=0;
int k=0;
int swap=0;
while(i<=mid-1 && j<=r) {
if(arr[i]<=arr[j]) {
temp[k++]=arr[i++];
}
else {
temp[k++]=arr[j++];
swap+=(mid-i);
}
}
while(i<=mid-1) {
temp[k++]=arr[i++];
}
while(j<=r) {
temp[k++]=arr[j++];
}
for(i=l;i<=r;i++) {
arr[i]=temp[i];
}
return swap;
}
}
这是我的代码,我试图解决它 5 个小时,但我没有得到任何人可以帮助的问题。 我也检查资源,但代码与源代码相同,但没有运行。
提示:
实际错误是您试图获取数组元素 1 超出数组末尾的位置。 (数组索引从0
到array.length - 1
。)
使用堆栈跟踪中的行号来准确计算出异常发生在代码的哪一行。 它发生在merge
方法中的数组索引操作中。 有 6 行可能发生这种情况。
添加一些trace print,打印出merge
方法中关键点处关键变量的值; 例如l
、 r
和mid
是什么,以及i
、 j
和k
是什么。
运行修改后的代码,查看跟踪打印输出的值,并尝试可视化代码在做什么。
找出超出数组末尾的位置和原因……并找出需要更改的内容。
您的merge
方法失败,因为您没有根据temp
数组的大小验证k
。
我建议对您的merge
方法进行以下小的修改,这将为您提供正确的答案:
while (i <= mid - 1 && j <= r && k<temp.length) {
if (arr[i] <= arr[j] ) {
temp[k++] = arr[i++];
} else {
temp[k++] = arr[j++];
swap += (mid - i);
}
}
while (i <= mid - 1 && k < temp.length) {
temp[k++] = arr[i++];
}
while (j <= r && k < temp.length) {
temp[k++] = arr[j++];
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.