MergeSort问题

时间:2014-11-12 07:35:55

标签: java sorting mergesort

我尝试将MergeSort放入代码中(见下文)。问题是:在任何情况下都没有正确排序。 55%(1000个随机数组)正确排序,其余不是。我无法弄清楚什么是错的。任何帮助/提示将不胜感激:

import java.util.Arrays;
    public class MergeSort {
        public static void sort(int[] a){
            if (a.length > 1){
                int[] left = Arrays.copyOfRange(a,0,a.length/2);
                int[] right = Arrays.copyOfRange(a,a.length/2,a.length);
                sort(left);
                sort(right);
                a = merge(left,right);
            }
     }

    private static int[] merge (int[] a, int[] b){
        int[] c = new int[a.length+b.length];
        int i = 0, j=0, k=0;

        while ((i < a.length) && (j <b.length)){
            if (a[i] < b[j]) c[k++] = a[i++];
            else c[k++] = b[j++];
        }
        while (i<a.length) c[k++] = a[i++];
        while (j<b.length) c[k++] = b[j++];                                         
    return c;
    }

}

1 个答案:

答案 0 :(得分:3)

据我所知,您的合并排序算法没有任何问题,但是行中存在期望问题

a = merge(left,right);

在此行之后,您希望更改先前递归调用的值,但这样做只会更改您在本地范围内引用的值。

我试图在下面的代码中演示问题:

public static void main(String[] args)
{
    Integer[] arr = new Integer[1];
    arr[0] = 0;

    changeArray(arr);

    System.out.println(arr[0]);

    changeArrayCorrected(arr);

    System.out.println(arr[0]);
}

public static void changeArray(Integer[] arr)
{
    Integer[] anotherArray = new Integer[1];
    anotherArray[0] = 1;
    arr = anotherArray;
}

public static void changeArrayCorrected(Integer[] arr)
{
    arr[0] = 1;
}

出于完全相同的原因,您将看到输出分别为0和1。

有关该主题的更多信息:

Are arrays passed by value or passed by reference in Java?

精确解决方案:

替换行 - &gt;

a = merge(left,right);

使用 - &gt;

System.arraycopy(merge(left,right),0, a, 0, a.length);