歸併排序(英語:merge sort,或mergesort),是建立在歸併操作上的一種有效的排序演算法,效率為o(n·log n)。和快速排序一樣,該演算法是採用分而治之(divide and conquer)的思想,也是乙個非常典型的應用,且各層分治遞迴可以同時進行。
採用分治法:
歸併操作(merge),指的是將兩個已經排序的序列合併成乙個序列的操作,歸併排序依賴歸併操作。仔細觀察下面歸併排序的過程
歸併排序**如下:
1該演算法使用了遞迴,思想是一直把陣列分成兩段,直至分成只有乙個數,然後兩段開始比較且開始合併,並複製到另外乙個陣列中。它的遞迴操作就像乙個二叉樹,處理完左邊的子節點(☞分的段)才開始處理右節點,處理右節點時也是先處理左節點,然後再處理右節點,就是這樣乙個過程。該演算法額外占用了乙個相同大小的空陣列,因而空間複雜度為o(n)。從下面這個遞迴樹可以看出,第一層時間代價為cn,第二層時間代價為cn/2+cn/2=cn.....每一層代價都是cn,總共有logn+1層,所以總的時間代價為cn*(logn+1),時間複雜度為o(n·logn)。這裡,合併排序是一種遞迴演算法,時間複雜度可以表示為一下遞迴關係:static
void merge_sort_recursive(int arr, int result, int start, int
end)
16//
合併17
while(start1 <=end1)
20while (start2 <=end2)
23for(k = start;k <= end; k++) 26}
2728
public
static
void merge_sort(int
arr)
t(n) = 2·t(n / 2) + θ(n)
其遞迴的解是θ(n·logn)。合併排序的時間複雜度在三種情況下(最好、最壞、平均) 均為θ(n·logn),因為合併排序始終將陣列分為兩半,並花費線性時間來合併兩半。
下面的圖是遞迴樹,利用它來理解遞迴的時間複雜度問題,它將問題對半遞迴分解為子問題,樹高為logn,每一層的成本為cn,最後葉子節點處理成本為c,總的成本為c·n·logn + cn,所以這是乙個o(n·logn)級別的演算法。
測試**如下:
1結果如下:public
static
void
main(string args) ;34
merge_sort(arr);56
system.out.println(arrays.tostring(arr));
7 }
排序演算法(四) 歸併排序
合併排序也即歸併排序,是將兩個或兩個以上的有序表合併成乙個新的有序表的操作,是分治法的乙個典型應用。先使每個子串行有序 段內有序 再使子串行段間有序,最後合併後得到完全有序的序列。歸併排序可以使用遞迴實現,遞迴的條件是序列起始位置 startindex 小於序列結束位置 endindex 即序列元素...
排序演算法四 歸併排序
歸併排序 思想 1 先對資料的整體進行劃分 把資料劃分為左右均等的兩部分,繼續劃分,直到資料分組有序為止 2 每個分組只剩下乙個元素則是有序的 3 把兩個部分 資料 歸併成乙個部分 逐次歸併 給定乙個輔助空間,給定乙個指標放在第乙個陣列的起始位置x1,給定另乙個指標放在另乙個陣列的起始位置x2,給定...
常見排序演算法總結 3 歸併排序
3 歸併排序 將陣列不斷拆分,拆分為多個只包含單個元素的陣列。再將陣列不斷有序合併,合併為乙個有序的陣列。遞迴 合併簡稱歸併,合併都能理解,那什麼是遞迴呢,遞迴其實就是在一次大規模運算中,其中的一步或幾步計算用到了前面的運算結果,舉個例子 第一天給你一塊錢,第二天給你兩塊錢,第三天四塊,以此類推每天...