Java 合并排序索引错误
我有两个数组,一个字符串和一个int,我想按int数组对数组排序,而字符串数组必须与int数组相对应,所以如果我移动一个int,我需要移动一个字符串,反之亦然。按照我现在的方式,我得到了例外Java 合并排序索引错误,java,mergesort,Java,Mergesort,我有两个数组,一个字符串和一个int,我想按int数组对数组排序,而字符串数组必须与int数组相对应,所以如果我移动一个int,我需要移动一个字符串,反之亦然。按照我现在的方式,我得到了例外 public static void mergeSort(int[] arr,String[] str) { if (arr.length > 1 && str.length > 1) { int[] left = Arrays.copyOfRange(a
public static void mergeSort(int[] arr,String[] str) {
if (arr.length > 1 && str.length > 1) {
int[] left = Arrays.copyOfRange(arr, 0, arr.length/2);
int[] right = Arrays.copyOfRange(arr, left.length, arr.length);
String[] Sl = Arrays.copyOfRange(str, 0, str.length/2);
String[] Sr = Arrays.copyOfRange(str, Sl.length, str.length);
mergeSort(right, Sr);
mergeSort(left, Sl);
merge(right, left, Sr, Sl,arr, str);
}
}
public static void merge(int[] left, int[] right,
String[] Sleft, String[] Sright,
int[] orig, String[] sorig) {
int i = 0;
int j = 0;
int f = 0;
int tots = right.length + left.length;
while (f < tots) {
if (i < left.length && j < right.length) {
if (left[i] < right[j]) {
orig[f] = left[i];
sorig[f] = Sleft[i];
i++;
f++;
} else if(left[i] > right[j]) {
orig[f] = right[j];
sorig[f] = Sright[j];
j++;
f++;
}
} else if (i >= left.length) {
orig[f] = left[i];
sorig[f] = Sleft[i];
f++;
j++;
} else if (j >= left.length) {
orig[f] = right[j];
sorig[f] = Sright[j];
f++;
i++;
}
}
}
publicstaticvoidmergesort(int[]arr,String[]str){
如果(arr.length>1&&str.length>1){
int[]left=Arrays.copyOfRange(arr,0,arr.length/2);
int[]right=Arrays.copyOfRange(arr,left.length,arr.length);
String[]Sl=Arrays.copyOfRange(str,0,str.length/2);
String[]Sr=Arrays.copyOfRange(str,Sl.length,str.length);
合并排序(右,Sr);
合并排序(左,Sl);
合并(右、左、Sr、Sl、arr、str);
}
}
公共静态无效合并(int[]左,int[]右,
String[]Sleft,String[]Sright,
int[]orig,String[]sorig){
int i=0;
int j=0;
int f=0;
int tots=right.length+left.length;
而(f右[j]){
orig[f]=右[j];
sorig[f]=Sright[j];
j++;
f++;
}
}else if(i>=左.长){
原[f]=左[i];
sorig[f]=Sleft[i];
f++;
j++;
}else如果(j>=左.长){
orig[f]=右[j];
sorig[f]=Sright[j];
f++;
i++;
}
}
}
问题在于:
} else if (i >= left.length) {
orig[f] = left[i];
在这一点上,
i
将始终是不受限制的,因为您正在专门测试它是否只是前面的一行 如果有一些数组中包含示例值,甚至可能有一个完全工作的类,带有一个main函数,这会很有帮助,因此我们不必自己创建它们。尝试代码比仅仅看代码要好得多…更改copyOfRange(arr,left.length,arr.length);复制范围(arr,left.length-1,arr.length);字符串[]Sr=Arrays.copyOfRange(str,Sl.length,str.length);字符串[]Sr=Arrays.copyOfRange(str,Sl.length-1,str.length);