【发布时间】:2014-02-27 02:33:08
【问题描述】:
我正在尝试在 Java 中为我的算法类实现合并排序。我尝试了几种方法,包括使用 Java 的 Double.POSITIVE_INFINITY 类型转换为整数的值将两个数组中的最后一个数组索引分配为“无穷大”。
import java.util.Arrays;
public static int[] mergeSort(int[] arr, int p, int r){
int[] sortedArray = new int[1];
if(p<r){
int q = (int)Math.floor((p+r)/2);
mergeSort(arr,p,q);
mergeSort(arr,q+1,r);
sortedArray = merge(arr,p,q,r);
}
return sortedArray;
}
public static int[] merge(int[] arr, int p, int q, int r){
//I've tested here with an array of size two, and left returns an array
//length of zero. I'm not sure if it might have to do with how the base case
//of size 1 arrays is handled.
int[] left = Arrays.copyOfRange(arr,p,q);
int[] right = Arrays.copyOfRange(arr,q+1,r);
int i = 0, j = 0;
int k;
//merge the two arrays; check to see if the i or j indexes are out of range
//before attempting to merge
for(k = p; k <= r-1 && i < left.length && j < right.length; k++){
if(left[i] <= right[j]){
arr[k] = left[i];
i++;
}else{
arr[k] = right[j];
j++;
}
}
//I was handling these assignments in the loop above, but my index variables were going
//out of range when Arrays.copyOfRange() returned arrays of length 0.
if(i >= left.length && j < right.length){
while(j < right.length){
arr[k] = right[j];
j++;
}
}else if(j >= right.length && i < left.length){
while(i < left.length){
arr[k] = left[i];
i++;
}
}
return arr;
}
我认为我的问题只是几个索引值稍微偏离了一点,但我无法弄清楚它们在我的一生中会出现在哪里。
【问题讨论】:
-
为什么不在你怀疑它们出错的地方打印出那些索引值呢?或者通过调试器来做同样的事情?查看它与您预期的差异,并不断缩小范围,直到找到问题的根源。
-
我已经通过打印索引值进行了查看,但我还没有明确考虑使用调试器并单步执行。我正在使用 Dr. Java,我不确定它是否具有该功能,但我会四处寻找。谢谢!
-
System.out.println("1. " + index);...System.out.println("2. " + index);...System.out.println("3. " + index); -
facepalm 因为我将“调试器”视为顶部的下拉菜单