Mergesort算法实现

时间:2015-03-26 09:28:31

标签: sorting mergesort

我已经完成了合并排序算法。我理解逻辑,但我不明白为什么我们必须将b []数组再次复制到[]数组中。我们在b []数组中输入的只是有序数字,对吧?但是,如果我们打印b []数组,我们会得到未排序的数组。一旦我们将它复制到[]数组中,我们就会得到正确的输出。谁能解释为什么我们必须将b []数组复制到[]数组?

算法::     void MergeSort(int low,int high)

   {
       if (low < high) { 
              int mid = (low + high)/2;
              MergeSort(low, mid);
              MergeSort(mid + 1, high);
              Merge(low, mid, high);
       }
   }

   void Merge(int low, int mid, int high)
   {
       int h = low, i = low, j = mid+1, k;
       while ((h <= mid) && (j <= high)) {
          if (a[h] <= a[j]) { 
              b[i] = a[h]; 
              h++;
              }
          else { 
              b[i] = a[j]; 
              j++;
              }
              i++;
       }
       if (h > mid) 
           for (k=j; k<=high; k++) {
               b[i] = a[k]; i++;
                    }
       else 
           for (k=h; k<=mid; k++) {
               b[i] = a[k]; i++;
            }
       for (k=low; k<=high; k++) 
           a[k] = b[k];
   }

我实施的计划:

import java.util.Arrays;
 public class Msort 
{
    public static void msort(int[] arr, int l, int h){
        int m;
        if (l<h)
        {
            m=(l+h)/2;
            msort(arr,l,m);
            msort(arr,m+1,h);
            merge(arr,l,m,h);
        }
    }   
    public static void merge(int arr[], int l, int m, int h){

        int i=l, j=m+1, k=l, n;
        int[] sarr = new int[arr.length];
        while ((i<=m)&&(j<=h))
        {
            if (arr[i]<=arr[j])
            {
              sarr[k]=arr[i];
              i++;
            }
            else{
            sarr[k]=arr[j];
              j++;

            }
            k++;
        }
        if (i<=m)
        {
            for (n=i;n<=m ;n++ )
            {
                sarr[k]=arr[n];
                k++;
            }
        }

        else{

         for (n=j;n<=h ;n++ )
            {
                sarr[k]=arr[n];
                k++;
            }
        } 

for (k=l;k<=h ;k++ )
{
    arr[k]=sarr[k];

}
System.out.println("arr"+Arrays.toString(arr));
    }
    public static void main(String[] args) 
    {
        int[] arr={12, 11, 13, 5, 6, 7};

        Msort.msort(arr, 0, arr.length-1);
    }
}

1 个答案:

答案 0 :(得分:1)

合并排序的工作方式是将未排序的数据拆分为单个元素,将一个元素视为已排序,然后将它们合并为更大的排序块。

b阵列是&#39;工作台&#39;在您的实现中,并且在每次迭代结束时(在您的示例中递归),保存迭代完成的工作的结果。通过将未排序数组的左侧和右侧复制到b数组中来进行拆分。

为了在你来的时候建立合并后的结果&#39;备份&#39;通过拆分数组,您需要重新构建组件的结果,这是通过将已排序的块重新复制到其未分类的原始文件上来完成的。

如果更改递归,则可以避免复制,以便合并的方向(从左到右或从右到左/从低到高或从高到低)与递归的级别相对应。完全复制就地合并排序,没有b数组,是一个更复杂的算法。