歸併排序是另一種排序演算法,也是採用分治的思想,但是和快排有很大的區別,歸併排序是穩定的,而快排則不穩定
歸併排序的思想可以簡單的分為三個步驟:
確定分界點 mid
遞迴分界點得到左右空間
歸併,將若干陣列合併為乙個有序陣列
確定分界點,歸併排序的分界點即為陣列的中點,設陣列左邊界為 left,有邊界為 right,那麼分界點 mid 便為
int mid = (l + r) / 2;
歸併排序的分界點和快排的分界點有本質的區別,快排的分界點是對陣列的元素值而言的,而歸併排序的分界點是就陣列的 index 來說的
通過確定的分界點,乙個陣列就被分解成了兩個以 mid 為分界的陣列,第乙個陣列的就原素組而言的下標範圍是 left <= index <= mid,第二個陣列是 mid + 1 <= index <= right
根據第一步得到的結果,可以使用遞迴將得到的兩個陣列繼續分解,即
merge_sort(q, l, mid);
merge_sort(q, mid + 1, r);
這是歸併排序最重要的一步,是對歸併得到的陣列得處理,對於兩個有序陣列來說,想要合併,就要不斷得對比陣列頭位置元素的大小,這又是使用雙指標,分別指向兩個陣列的頭元素,不斷對比兩個指標對應元素大小,儲存較小的那個,並後移與其對應的指標,由於兩個指標實際上是分步執行的,當其中乙個陣列被遍歷完後,直接將另乙個陣列接到答案陣列的尾部即可,**如下
//k 用來記錄答案陣列中現存元素的數量
int k = 0, i = l, j = mid + 1;
while (i <= mid && j <= r)
while (i <= mid)
tmp[k++] = q[i++];
while (j <= r)
tmp[k++] = q[j++];
for (i = l, j = 0; i <= r; i++, j++)
q[i] = tmp[j];
#include using namespace std;
const int n = 100000;
int q[n], tmp[n];
int n;
void merge_sort(int q, int l, int r)
while (i <= mid)
tmp[k++] = q[i++];
while (j <= r)
tmp[k++] = q[j++];
for (i = l, j = 0; i <= r; i++, j++)
q[i] = tmp[j];
}int main()
merge_sort(q, 0, n - 1);
for (int i = 0; i < n; i++)
return 0;
}
歸併演算法 歸併排序
歸併演算法 歸併排序 這周需要用到歸併演算法,於是找了找相關的資料,整理如下 歸併排序 merge sort 是利用 歸併 技術來進行排序。歸併是指將若干個已排序的子檔案合併成乙個有序的檔案。兩路歸併演算法 1 演算法基本思路 設兩個有序的子檔案 相當於輸入堆 放在同一向量中相鄰的位置上 r low...
歸併排序演算法
include stdafx.h include include include 合併兩段已經排好序的列表 void merge int list int mergelist int left int mid int right else if i mid else 將列表list按照seglen分...
歸併排序演算法
這個演算法感覺比插入難理解一些,下面說說我的理解 歸併排序的步驟 1.把長度為n的序列分為兩個長度為n 2的子串行 2.對這兩個子串行分別採用歸併排序 3.將兩個子串行合併成乙個最終的排序序列 通過步驟2可看到 在歸併排序中又用了歸併排序,可見這是乙個遞迴的過程。例如乙個陣列 a 8 下面採用遞迴排...