将合并排序伪代码转换为运行Java代码

时间:2016-04-20 17:58:53

标签: java algorithm sorting pseudocode

我尝试将此Merge Sort伪代码转换为Java但未获得正确的输出。这是伪代码:

Merge-Sort(A, p, r )
   if p < r
     then q←(p+r)/2 
     Merge-Sort(A, p, q)
     Merge-Sort(A, q + 1, r )
     Merge(A, p, q, r )


Merge(A, p, q, r )
   for k←1 to r−p+1 do
     if j>r or (i ≤ q and A[i] ≤ A[j])
     then B[k]←A[i]; i←i+1 else B[k]←A[j];j←j+1
   for k←1 to r−p+1 do A[k+p−1]←B[k]

这是我的Java代码:

公共类MergeSort {

public static void main(String[] args) {
    int[] a = {2, 6, 3, 5, 1};
    mergeSort(a, 0, a.length - 1);
    for (int i = 0; i < a.length; i++) {
        System.out.print(" " + a[i]);
    }
}

public static void mergeSort(int[] a, int from, int to) {
    final int begin = from, end = to;
    if (begin < end) {
        final int mid = (begin + end) / 2;
        MergeSort.mergeSort(a, begin, mid);
        MergeSort.mergeSort(a,  mid+1, end);
        MergeSort.merge(a, begin, mid, end);
    }
}

private static void merge(int[] a, int from, int mid, int to) {
    final int begin = from, mitte = mid, end = to;

    int[] B = new int[a.length];

    int i = begin, j = mitte;
    for (int k = 0; k <= end-begin; k++) {
        if (j > end || (i <= mitte && a[i] <= a[j])) {
            B[k] = a[i];
            i++;
        } else {
            B[k] = a[j];
            j++;
        }
    }

    for (int k = 0; k < end-begin; k++) {
        a[k + begin] = B[k];
    }
}

可悲的是,它不是那样的。我认为我对某些索引做错了但我无法弄清楚错误究竟在哪里。 我需要尽可能地贴近这个伪代码。 如果有人能告诉我我做错了什么,那就太好了。

1 个答案:

答案 0 :(得分:0)

为Merge算法提供的伪代码有点不正确,因为当只有一个指针移动而其他指针保持静止时,它没有说明情况。

在上面提到的情况下,您必须通过移动静止指针来单独填写临时数组。

此外,所需的B长度为to - from + 1,而且应为j = mitte + 1而不是j = mitte合并的正确代码为:

private static void merge(int[] a, int from, int mid, int to) {
        final int begin = from, mitte = mid, end = to;

        int[] B = new int[end-begin+1];
        int k=0;
        int i = begin, j = mitte+1;
        while(i<=mid&&j<=end)
            if(a[i]<=a[j]){
                B[k++] = a[i];
                i++;
            } else {
                B[k++] = a[j];
                j++;
            }
        //in case i remained stationary
        while(i<=mid)
            B[k++] = a[i++];

        //in case j remained stationary
        while(j<=end)
            B[k++] = a[j++];

        //Now copy the array
        i=0;
        for(k=begin;k<=end;++k)
         a[k]=B[i++];
    }