歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是分治法(divide and conquer)的乙個非常典型的應用。
首先考慮如何將兩個有序數列合併成乙個有序序列?這個非常簡單,只要比較兩個數列的第乙個數,誰小就先取誰,然後插入到新數列,再依次比較這兩個數列剩餘的數,誰小先把誰取出插入新數列,如果有數列為空,那直接將另乙個數列的資料依次取出插入新數列即可。
//將有序陣列a和b合併到c中
void memeryarray(int a, int n, int b, int m, int c)
while (i < n)
c[k++] = a[i++];
while (j < m)
c[k++] = b[j++];
}
可以看出合併有序數列的效率是比較高的,時間複雜度可以達到o(n)。
解決了上面的有序數列合併問題,再來看歸併排序,基本思路就是將陣列分成兩組a,b,如果這兩組組內的資料都是有序的,那麼就可以很方便的將這兩組資料進行排序。
如何讓這兩組資料分別有序呢?可以將a,b組兩組再各自分成兩組。依次類推,如下圖所示,當分出來的小組只有乙個資料時,其實這個小組的是資料已經達到了有序(乙個數怎麼都是有序的,難道不是嗎!),然後再合併相鄰的兩個小組(有序陣列的合併問題)就可以了。綜述,歸併排序問題可以分成兩步進行,首先通過遞迴的分解數列成有序數列,再合併有序數列就解決了問題(顯然分而治之思想)。
動畫演示:
兌現**:
#includeusing namespace std;
//列印陣列
templatevoid printarray(t arr,int n)
while (i <= m)
temp[k++] = a[i++];
while (j <= n)
temp[k++] = a[j++];
for (i = 0; i < k; i++)
a[first + i] = temp[i];
}
templatevoid mergesort(t a, int first, int last, t temp)
}
templatebool mergesort(t a, int n)
int main()
; char s = ;
mergesort(b,8);
mergesort(s,5);
printarray(s,5);
printarray(b,8);
system("pause");
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 下面採用遞迴排...