簡體   English   中英

正確的Mergesort實施?

[英]Correct Mergesort implementation?

我正在研究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] + " ");
    }
}

解決您的問題,而無需深入分析您的代碼...

基本上是。 不必同時在兩個半部上工作。 實際上,您甚至可以在不看第二部分的情況下就完全將其分類。 這不會損害算法的正確性。

以稍微不同的方式,如果要提高效率 (即同時對每個獨立的半部分進行排序),則必須使用多線程,手工編寫起來要困難得多。

(如果這是一門基礎算法課程,那么您可能根本不需要知道如何制作多線程MergeSort,因為這將涉及與並發/同步/線程池有關的許多設計決策,這是一個整個不同的主題)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM