对于这个项目,我给出了一个字符串数组和一个int数组。 int [1]是字符串[1]的排名。我需要使用mergesort按顺序从1到n对int数组进行排序,我在下面做了。但是当int数组被移动时我还需要切换字符串数组的位置,这样它们都被排序,如果这有意义的话?我无法弄清楚我的编码有什么问题,或者即使我的想法确实有效,但我仍然在stringSorted [k] = stringRight [j]上得到一个数组索引超出界限错误,我无法弄清楚是否有解决这个问题的方法。本质上,当一个int被添加到sortedInt数组时,我还将该元素添加到已排序的String数组中。感谢您的帮助,如果有什么不合理的话,请告诉我
private static int sortAndCount(int intToSort[]){
int inversionsLeft;
int inversionsRight;
int inversionsMerged;
if(intToSort.length == 1){
return 0;
}
int m = intToSort.length/2;
int[] intLeft = new int[m];
stringLeft = new String[m];
int[] intRight = new int[intToSort.length-m];
stringRight = new String[intToSort.length-m];
for (int i=0; i < m; i++){
intLeft[i] = intToSort[i];
stringLeft[i] = stringToSort[i];
}
for (int i = 0;i < intRight.length; i++){
intRight[i] = intToSort[m+i];
stringRight[i] = stringToSort[m+i];
}
inversionsLeft = sortAndCount(intLeft);
inversionsRight = sortAndCount(intRight);
intSorted = new int[intToSort.length];
stringSorted = new String[stringToSort.length];
inversionsMerged = mergeAndCount(intLeft, intRight);
return(inversionsLeft + inversionsRight + inversionsMerged);
}
private static int mergeAndCount(int[] intLeft, int[] intRight){
int count = 0;
int i = 0;
int j = 0;
int k = 0;
while(i < intLeft.length && j < intRight.length){
if(intLeft[i] < intRight[j]){
intSorted[k] = intLeft[i];
stringSorted[k] = stringLeft[i];
i++;
}
else{
intSorted[k] = intRight[j];
stringSorted[k] = stringRight[j];
count += intLeft.length - i + 1;
j++;
}
k++;
}
while (i < intLeft.length)
{
intSorted[k] = intLeft[i];
stringSorted[k] = stringLeft[i];
k++;
i++;
}
while (j < intRight.length)
{
intSorted[k] = intRight[j];
stringSorted[k] = stringRight[j];
j++;
k++;
}
return count;
}
}
答案 0 :(得分:0)
int[] intLeft = new int[m];
stringLeft = new String[m];
int[] intRight = new int[intToSort.length-m];
stringRight = new String[intToSort.length-m];
你会注意到,对于int数组,你要创建新变量,对于要替换外部的字符串。这会使每个递归调用使string
数组变小,而将int
数组传递给每个方法。
当您致电mergeAndCount
时,stringLeft
和stringRight
非常小,而适当大小的intLeft
和intRight
会作为参数传递。