1. 程式人生 > 實用技巧 >資料結構定義和演算法--排序--歸併排序

資料結構定義和演算法--排序--歸併排序

演算法原理

先把資料從中間分為前後兩部分,然後對前後兩部分分別排序,最後將排好序的合併到一起。

如何實現

  1. 遞推公式:merge_sort(p, r) = merge(merge_sort(p, q), merge_sort(q+1, r))
  2. 終止條件:p >= r

演算法穩定性

歸併演算法是否穩定,關鍵在於merge函式合併時的程式碼。在合併過程衝如果A[p, q]和A[q+1, r]中有值相同的元素,將A[p, q]中的元素放在temp前面,就可以保證演算法的穩定性。

時間複雜度

  1. 分析歸併演算法時間複雜度就是分析遞迴程式碼的時間複雜度:T(a) = T(b) + T(c) + K(a問題可以分解為b和c子問題,K為合併所需用時間);
  2. 具體計算:T(1) = C; T(n) = 2 * T(n/2) + n = 2 * (2 * T(n/4) + n/2) + n = 4 * T(n/4) + 2 * n = 8 * T(n/8) + 3 * n = 16 * T(n/16) + 4 * n = ...... =2^k * T(n/(2^k)) + k * n = ......,當n/(2^k) == 1時,即k == log2n,遞迴結束。此時T(n) = Cn + nlog2n,因此歸併演算法時間複雜度為O(nlogn);

空間複雜度

  1. 歸併演算法不是原地排序演算法;
  2. 空間複雜度並不像時間複雜度那樣累加,即在每次合併的時候都會申請新的記憶體空間,但是合併之後就釋放掉了,因此空間複雜度是O(n);