Java中Merge Sort算法的意外行为

时间:2016-12-07 15:22:28

标签: java algorithm data-structures

我已经测试了合并方法并且它适用于所有情况但是不知何故mergeSort方法没有产生正确的输出,它只是将数组划分为更小的子数组然后将它传递给合并它们的方法。

public class MergeSort {
      public static void main(String[] args) throws ArrayIndexOutOfBoundsException{

         int a[]={2,4,5,7,1,2,3,6};

         System.out.println("Unsorted Array");
         for(int i=0;i<a.length;i++){
            System.out.print(a[i]+" ");
         }

         int p=0,r=7;
         try{
            MergeSort m=new MergeSort();



            m.mergeSort(a,0,7);
         }
         catch(Exception e )
         {
            e.printStackTrace();
         }
         System.out.println("\nSorted Array");
         for(int i=0;i<a.length;i++){
            System.out.print(a[i]+" ");
         }
      }

      void mergeSort(int a[],int p,int r)
      {
          int q;
          if(p<r)
          {
              q= (p+r)/2;
              System.out.print("  "+q);
              mergeSort(a,p,q);
              mergeSort(a,q+1,r);
              merge(a,p,q,r);
          }


      }

      int [] merge(int a[],int p,int q,int r){
      //int a[]={2,4,5,7,1,2,3,6};
      int n1=q-p+2;
      int n2=r-q+1;

      int L[]=new int[n1];
      int R[]=new int[n2];

      for(int i=0;i<n1 -1;i++){
        L[i]=a[i];
      }
      L[n1 -1] = Integer.MAX_VALUE;
      //q=q+1;
      for(int i=0;i<n2 -1;i++){
        R[i]=a[q+i+1];

      }
      R[n2-1] = Integer.MAX_VALUE;

      //L[n1+1]=9;
      ///R[n2+1]=9;

      int i=0,j=0;

      for(int k = p; k <= r; k++){
          if(L[i] <= R[j]){
            a[k] = L[i++];
        }else{
            a[k] = R[j++];
        }
      }
      return a;
     }
    }

1 个答案:

答案 0 :(得分:1)

对不起,您的合并方法在所有情况下都无法正常工作。在排序过程中,您使用参数merge()[2, 2, 4, 7, 1, 2, 3, 6]44致电5。这应该保持数组不变,但它将数组更改为[2, 2, 4, 7, 2, 2, 3, 6] - 有一个2,其中有1。

我认为错误存在于merge()

的这些行中
  for(int i=0;i<n1 -1;i++){
    L[i]=a[i];
  }

你应该从索引a开始从p获取元素。相反,你从索引0开始。在前几次调用merge()时,p为0,所以没有区别,所以我理解你如何错过测试中的错误。稍后当p为2或4时,事情就会出错。