演算法 歸併排序

2021-10-02 04:40:03 字數 1487 閱讀 4280

​ 歸併排序是另一種排序演算法,也是採用分治的思想,但是和快排有很大的區別,歸併排序是穩定的,而快排則不穩定

​ 歸併排序的思想可以簡單的分為三個步驟:

確定分界點 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 下面採用遞迴排...