歸併:將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有
序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。
歸併的本質–空間換時間,通過申請乙個額外陣列儲存中間變化,從而實現排序
歸併排序核心步驟:
歸併排序的特性總結:
. 歸併的缺點在於需要o(n)的空間複雜度,歸併排序的思考更多的是解決在磁碟中的外排序問題。—外部排序首選
2. 時間複雜度:o(n*logn)
3. 空間複雜度:o(n)
4. 穩定性:穩定
merge(int array, int left, int mid, int right, int extra)
else
} while (i < mid)
while (j < right)
// 把 extra 的資料移回來
for (int x = left; x < right; x++)
}// [left, right)
void mergesort(int array, int left, int right, int extra)
// size == 0
if (right <= left)
// 1. 把陣列平均分成兩部分
int mid = left + (right - left) / 2;
// [left, mid)
// [mid, right)
// 2. 分治演算法,排序左右兩部分---遞迴的直到分成1個數字然後比較
__mergesort(array, left, mid, extra);
__mergesort(array, mid, right, extra);
// 3. 合併兩個有序陣列 [left, mid) [mid, right)
merge(array, left, mid, right, extra);
}void mergesort(int array, int size)
void mergesortnor(int array, int size)
int right = mid + i;
if (right > size)
merge(array, left, mid, right, extra);
} }free(extra);
}
歸併排序(分治)
把乙個陣列 a 分成兩個部分 s,m m 1,e 假設兩部分分別有序,把這兩部分合併到另一陣列中 tmp 保證該陣列有序,然後再把資料 e s 1拷貝回陣列a 分治的原理。把資料無限二分,最後比較兩個數即可。遞迴實現。includeusing namespace std int a 10 int b...
分治 歸併排序
將兩個排序好的陣列歸併過程如下 紅色的 1 是左邊起始位置 綠色的 2 是右邊起始位置 灰色的 最右邊 是右邊終點位置 include using namespace std typedef int elementtype l 左邊起始位置,r 右邊起始位置,rightend 右邊終點位置 void...
歸併排序 分治
在合併鍊錶的題目中,有乙個典型的題目 合併有序鍊錶 這道題的解法有很多,比較典型的解法是 分治法。這道題的題幹已經給出了重要的資訊 每乙個鍊錶的區域性是有序的。那麼,解決這道題時就可以利用這個特點,不用將每乙個元素逐個比較,可以將鍊錶兩兩排序合併。鍊錶兩兩排序合併有什麼好處?鍊錶兩兩排序可以降低比較...