歸併排序 分治

2021-09-26 01:49:58 字數 1285 閱讀 3999

歸併:將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有

序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。

歸併的本質–空間換時間,通過申請乙個額外陣列儲存中間變化,從而實現排序

歸併排序核心步驟:

歸併排序的特性總結:

. 歸併的缺點在於需要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...

歸併排序 分治

在合併鍊錶的題目中,有乙個典型的題目 合併有序鍊錶 這道題的解法有很多,比較典型的解法是 分治法。這道題的題幹已經給出了重要的資訊 每乙個鍊錶的區域性是有序的。那麼,解決這道題時就可以利用這個特點,不用將每乙個元素逐個比較,可以將鍊錶兩兩排序合併。鍊錶兩兩排序合併有什麼好處?鍊錶兩兩排序可以降低比較...