正确的Mergesort实施?

时间:2016-12-10 18:58:15

标签: java sorting mergesort

我正在研究MergeSort,我编写了这段代码。问题是,我不确定我的实现是否与该算法的工作方式完全一致。根据我所读到的,列表被分解为一半,直到所有列表的大小为1,然后排序的列表同时汇集在一起​​。例如,{2,4,1,5,8,7,6,3}应该分解为{2,4,1,5}和{8,7,6,3}然后这两个应该进一步同时分解为{2,4},{1,5},{8,7}和{6,3},依此类推。但是,使用我的代码,{2,4,1,5}被分解为其组件,然后在另一个数组({8,7,6,3})被分解之前完全排序。我想不出同时在两个阵列上工作的任何方法。我的代码似乎运行正常,但问题是:这段代码是MergeSort的有效实现吗?

public static void mergesort(int[] arr)
{
    if(arr.length == 1)
        return;
    int[] arr1 = new int[arr.length/2];
    int[] arr2 = new int[arr.length - arr1.length];
    int i = 0;
    for(int j = 0; j < arr1.length; j++, i++)
    {
        arr1[j] = arr[i];
    }
    for(int j = 0; j < arr2.length; j++, i++)
    {
        arr2[j] = arr[i];
    }
    mergesort(arr1);
    mergesort(arr2);
    int x = 0, y = 0, z = 0;
    while(x < arr1.length && y < arr2.length)
    {
        if(arr1[x] < arr2[y])
        {
            arr[z] = arr1[x];
            x++;
            z++;
        }
        else
        {
            arr[z] = arr2[y];
            y++;
            z++;
        }
    }
    if(x != arr1.length)
    {
        while(x < arr1.length)
        {
            arr[z] = arr1[x];
            x++;
            z++;
        }
    }
    else if(y != arr2.length)
    {
        while(y < arr2.length)
        {
            arr[z] = arr2[y];
            y++;
            z++;
        }
    }
}

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

1 个答案:

答案 0 :(得分:0)

离开你的问题而没有深入分析你的代码......

基本上,是的。没有必要同时在两半上工作。事实上,在你看下半场之前,你可以完全排序一半。这并没有损害算法的正确性。

稍微不同的是,如果你想让它更加高效(即同时对每个独立的一半进行排序),那么你将不得不使用多线程,这对于手工编码。

(如果这是基础算法课程,你可能不需要知道如何制作多线程MergeSort,因为这将涉及与并发/同步/有关的许多设计决策线程池,这是一个完全不同的主题)