歸併排序演算法

2021-07-22 14:24:49 字數 1592 閱讀 4856

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是分治法(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 下面採用遞迴排...