【问题标题】:Merge Sort Implementation Issues合并排序实现问题
【发布时间】: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 因为我将“调试器”视为顶部的下拉菜单

标签: java sorting mergesort


【解决方案1】:

在您的电话 Arrays.copyOfRange(arr,p,q) 中,范围从 p(包括)扩展到 q(不包括)。

如果 p 和 q 相等,则结果将是一个长度为零的数组。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多