1. 程式人生 > >排序演算法03-歸併排序

排序演算法03-歸併排序

與之前的排序不同,歸併排序採用分而治之的演算法設計思想,最終的時間複雜度為O(n\log n)

歸併排序的實現步驟:

1.分割:不斷的將陣列分割成兩個新陣列,直到長度為1;

2.合併:合併的過程也就是排序的過程,將兩個陣列按元素大小順序合併成一個新陣列,直到全部合併;

 

實現原理如下圖:

 

實現歸併排序的簡單程式如下:

    // 分割方法
    public static int[] mergeSort(int[] arr)
    {
        if (arr.length > 1)
        {
            int[] firstHalf = new int[arr.length / 2];
            System.arraycopy(arr, 0, firstHalf, 0, arr.length / 2);
            // 繼續分割前半段
            mergeSort(firstHalf);
            int secondHalfLen = arr.length - arr.length / 2;
            int[] secondHalf = new int[secondHalfLen];
            System.arraycopy(arr, arr.length / 2, secondHalf, 0, secondHalfLen);
            // 繼續分割後半段
            mergeSort(secondHalf);
            // 分割之後呼叫合併方法
            merge(firstHalf, secondHalf, arr);
        }
        return arr;
    }

    // 合併方法
    public static void merge(int[] arr1, int[] arr2, int[] temp)
    {
        int index1 = 0;
        int index2 = 0;
        int index3 = 0;
        while (index1 < arr1.length && index2 < arr2.length)
        {
            temp[index3++] = arr1[index1] < arr2[index2] ? arr1[index1++] : arr2[index2++];
        }
        while (index1 < arr1.length)
            temp[index3++] = arr1[index1++];
        while (index2 < arr2.length)
            temp[index3++] = arr2[index2++];
    }