二路歸並排序的java實現


轉載請注明出處 http://www.cnblogs.com/dongxiao-yang/p/6410775.html 

參考引言:在排序算法中快速排序的效率是非常高的,但是還有種排序算法的效率可以與之媲美,那就是歸並排序;歸並排序和快速排序有那么點異曲同工之妙,快速排序:是先把數組粗略的排序成兩個子數組,然后遞歸再粗略分兩個子數組,直到子數組里面只有一個元素,那么就自然排好序了,可以總結為先排序再遞歸;歸並排序:先什么都不管,把數組分為兩個子數組,一直遞歸把數組划分為兩個子數組,直到數組里只有一個元素,這時候才開始排序,讓兩個數組間排好序,依次按照遞歸的返回來把兩個數組進行排好序,到最后就可以把整個數組排好序;

 

public class mergesortutil {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        int[] a = new int[] { 11,9,7,5,3,1,12,10,8,6,4,2 };
        

        int[] tmp = new int[a.length];
        mergesort(a,0,a.length-1,tmp);
    }

    private static void mergearray(int[] array, int start, int middle, int end,int[] tmp) {

        int first = start;
        int second = middle + 1;
        int index = start;


        while ((first <= middle) && (second <= end)) {
            if (array[first] >= array[second])
                tmp[index++] = array[second++];
            else
                tmp[index++] = array[first++];
        }
        while (first <= middle)
            tmp[index++] = array[first++];
        while (second <= end)
            tmp[index++] = array[second++];

        for (first = start; first <= end; first++)
            array[first] = tmp[first];
        
        
        System.out.println("merge is "+Arrays.toString(array));

    }

    public static void mergesort(int[] array, int start, int end,int[] tmp) {

        if (start >= end)
            return;
        int middle = ((end + start) >> 1);
        mergesort(array, start, middle,tmp);// 遞歸划分左邊的數組
        mergesort(array, middle + 1, end,tmp);// 遞歸划分右邊的數組
        mergearray(array, start, middle, end,tmp);// 對有序的兩個數組進行合並成一個有序的數組
    }

}

 

程序調試輸出如下

merge is [9, 11, 7, 5, 3, 1, 12, 10, 8, 6, 4, 2]

merge is [7, 9, 11, 5, 3, 1, 12, 10, 8, 6, 4, 2]

merge is [7, 9, 11, 3, 5, 1, 12, 10, 8, 6, 4, 2]

merge is [7, 9, 11, 1, 3, 5, 12, 10, 8, 6, 4, 2]

merge is [1, 3, 5, 7, 9, 11, 12, 10, 8, 6, 4, 2]

merge is [1, 3, 5, 7, 9, 11, 10, 12, 8, 6, 4, 2]

merge is [1, 3, 5, 7, 9, 11, 8, 10, 12, 6, 4, 2]

merge is [1, 3, 5, 7, 9, 11, 8, 10, 12, 4, 6, 2]

merge is [1, 3, 5, 7, 9, 11, 8, 10, 12, 2, 4, 6]

merge is [1, 3, 5, 7, 9, 11, 2, 4, 6, 8, 10, 12]

merge is [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

 

調試過程輸出結果有助於更好的理解排序過程,整個排序在數組划分到最小長度后不斷進行局部排序和局部合並排序,最終合並為全數組。

 

 

參考資料 

歸並排序的原理及時間復雜度

白話經典算法系列之五 歸並排序的實現

排序算法之 歸並排序 及其時間復雜度和空間復雜度


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM