【问题标题】:mergesort not printing correct value [closed]合并排序没有打印正确的值[关闭]
【发布时间】:2014-07-20 07:54:24
【问题描述】:

我正在尝试实现归并排序算法,我做了你在下面看到的,但我似乎没有得到正确的结果,请检查我的代码,让我知道我缺少什么。

package test;

public class MergeSort {

  private static void mergesort(int[] arr, int n) {
      int mid;
      int[] left;
      int[] right;
      if(n<2 ){return;}
      mid = n/2;

      left = new int[mid];
      right = new int[n-mid];

      for(int i=0;i<mid;i++){
          left[i]=arr[i];

      }
      for(int i=mid;i<n;i++){
          right[i-mid]=arr[i];

      }

      mergesort(left,mid);
      mergesort(right,n-mid);
      merge(arr,left,mid,right,n-mid);

  }


private static void merge(int[] arr, int[] left, int leftcount, int[] right, int rightcount) {
    // TODO Auto-generated method stub
    int i,j,k;

    i=0;j=0;k=0;

    while(i<leftcount && j<rightcount){
        if(left[i] <right[i]){
            arr[k]=left[i];
            k++;
            i++;
        }
        else{
            arr[k]=right[j];
            k++;
            j++;

        }
    }

    //copy what left if any
    while(i<leftcount){
        arr[k]=left[i];
        k++;
        i++;
    }
    //copy whats left if any
    while(j<rightcount){
        arr[k]=right[j];
        k++;
        j++;
    }

}

public static void main(String[]args){

    int[] arr = {2,4,1,7,3};
    for(int i = 0;i<arr.length;i++){
        System.out.print(arr[i] + " ");
    }
    System.out.println();
    mergesort(arr,arr.length);
    for(int i = 0;i<arr.length;i++){
        System.out.println(arr[i] +" ");
    }       
  }
}

如您所见,我要排序的测试数组是 {2,4,1,7,3};但我有这个作为我的排序数组{1 3 7 2 4}

【问题讨论】:

  • 这很可能是一个错误。在相关位置放置断点并检查您的数组是否被正确拆分。

标签: java sorting mergesort array-merge


【解决方案1】:

你的问题出在这一行:

 if(left[i] <right[i]){

假设现在您有两个子集:{2, 4}{1, 3, 7}

i = 0: right[i] &lt; left[i] 你得到{1}

i = 1: right[i] &lt; left[i] 你会得到{1, 3} 而不是你想要的{1, 2}

所以你的问题是left[]right[]的索引相同。

解决方法:将该行改为

 if(left[i] <right[j]){

注意此外,学习调试也是一项非常重要的技能。

【讨论】:

  • @user3137376 很高兴它对您有所帮助并看到了注释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
  • 2015-04-14
  • 2015-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多