合并排序实施问题

时间:2014-02-26 18:10:59

标签: java sorting mergesort

我正在尝试在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;
}

我认为我的问题只是一些指数值稍微偏离,但我无法弄清楚它们对我来说会是什么样的。

1 个答案:

答案 0 :(得分:1)

在你的电话Arrays.copyOfRange(arr,p,q)中,范围从p(包括)延伸到q(不包括)。

如果p和q相等,则结果为零长度数组。

在您自己的方法签名中,考虑并记录端点r是包含还是排他。

另外,考虑一下当你的测试if(p<r)在mergesort()中失败时会发生什么 - 你返回一个新的1元素数组而不改变默认的成员。