排序演算法 歸併排序

2021-06-26 21:56:36 字數 963 閱讀 8320

歸併排序的思想其實完全是分治法的思想的體現,它完全遵循分治法的模式。

這裡有必要再重提下分治法的思想:

將原有的問題分解為幾個規模較小的但類似於原問題的子問題,遞迴的求解這些子問題,然後再合併這些子問題的解來求得原問題的解。

現在來看看歸併排序的操作:

1 將等待排序的含有 n 個元素的序列分解成各具有 n/2個元素的兩個子串行 (n為奇數時,某個子串行比另乙個會多乙個元素 但不會影響結果)

2 使用歸併排序遞迴的排序兩個子串行 ( 說白了就是把開始已分解的兩個子串行再各自往下分解 )

3 合併兩個已經排好序的子串行

我們有乙個序列 6 5 3 1 8 7 2 4

1 我們將其分為兩組 一組為 6 5 3 1  另一組為 8 7 2 4

2 對前面兩組再進行分解 6 5  和 3 1     以及  8  7  和 2  4

3 各小組進行排序得到    5 6  和  1 3     以及 7  8  和 2  4

4  5 6 和 1  3兩個小組進行合併 (比較並排序)   以及 7   8  和 2  4 兩個小組進行合併 (比較並排序) 得到兩個小組 1 3 5 6 和2 3 4 8

5 這兩個小組再合併 (比較並排序)  得到最終解 1  2  3  4  5  6  7  8

int array1[100]=,array2[100]=;//兩個陣列,用於記錄分解後的兩個子串行

void merge(int a,int p,int q,int r)

{ int n1=q-p+1;

int n2=r-q;

int i,j;

for(i=0;i

排序演算法 歸併排序

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。首先考慮下如何將將二個有序數列合併。這個非常簡單,只要從比較二個數列的第乙個數,誰小就先取誰,取了後就在對應數列中刪除這個數。然後再進行比較,如果有數列為空,那直接將另...

排序演算法 歸併排序

include include define status int define max 20 typedef struct elemtype typedef struct sqlist void inital sqlist l 初始化 bool lt int i,int j void merge ...

排序演算法 歸併排序

歸併排序 英語 merge sort,或mergesort 是建立在歸併操作上的一種有效的排序演算法,效率為o n log n 該演算法是採用分治法 divide and conquer 的乙個非常典型的應用,且各層分治遞迴可以同時進行。歸併操作也叫歸併演算法,指的是將兩個已經排序的序列合併成乙個序...