我正在尝试在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;
}
我认为我的问题只是一些指数值稍微偏离,但我无法弄清楚它们对我来说会是什么样的。
答案 0 :(得分:1)
在你的电话Arrays.copyOfRange(arr,p,q)
中,范围从p(包括)延伸到q(不包括)。
如果p和q相等,则结果为零长度数组。
在您自己的方法签名中,考虑并记录端点r
是包含还是排他。
另外,考虑一下当你的测试if(p<r)
在mergesort()中失败时会发生什么 - 你返回一个新的1元素数组而不改变默认的成员。