內部排序(四)歸併排序

2021-07-03 09:38:21 字數 1484 閱讀 8061

總述:歸併排序(merging sort)中歸併是將兩個或兩個以上的有序表組合成乙個新的有序表。

歸併排序我們主要**2-路歸併排序

2-路歸併排序 過程:假設初始序列含有n個記錄,則可看成是n個有序的子串行,每個子串行的長度為1,然後兩兩歸併,得到ceil(n/2)個長度為2或1的有序子串行;再兩兩歸併,……如此重複,直至得到乙個長度為n的有序序列為止。

2-路歸併排序 過程演示

演算法敘述

2-路歸併排序中的核心操作是歸併操作,將一維陣列中前後相鄰的兩個有序子串行歸併為乙個有序序列,其演算法:

1、 申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列

2、設定兩個指標,最初位置分別為兩個已經排序序列的起始位置

3、比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置

4、重複步驟3直到某一指標到達序列尾

5、將另一串行剩下的所有元素直接複製到合併序列尾

演算法**

#include 

#include

#define maxsize 20

typedef

int keytype;//定義關鍵字型別為int

typedef

char infotype;//定義其他資訊型別為char

typedef

structredtype;

typedef

structsqlist;

//此函式將兩個相鄰有序子串行sr[1...m]和sr[m+1...n]合併成乙個有序的tr[i...n]

void merge(redtype sr, redtype tr, int i, int m, int n)

else

}//將剩下的多餘記錄直接放到合併序列尾部

if (i<=m)

}if (j<=n)

}}//此函式將sr[s...t]歸併為tr1[s...t]

void msort(redtype sr, redtype tr1, int s, int t)else

}//對順序表l作歸併排序

void mergesort(sqlist *l)

評價

1、實現歸併排序需和待排記錄等數量的輔助空間,其時間複雜度為o(niogn)

2、與快速排序和堆排序相比,歸併排序最大的特點是,它是一種穩定排序方法,

2、遞迴形式的演算法形式上較為簡潔,但實用性很差!

4 內部排序 歸併排序

歸併排序 歸併排序和快速排序這兩種演算法都採用了分治的思想,且速度僅次於 快速排序 為穩定排序演算法,一般用於對總體無序,但是各子項相對有序的 數列,其具體思想如下 1 將序列每相鄰兩個數字進行歸併操作 merge 形成 n 2 個序列,排序後每個序列包含兩個元素 2 將上述序列再次歸併操作,形成 ...

內部排序之歸併排序

1.歸併排序 歸併排序,顧名思義就是將兩個序列合併到一起,並且使之有序。該演算法是分治法的乙個典型應用,其主要思想是將已有序的兩個子串行合併,在這個過程中,對其元素進行比較排序,從而得到乙個完整的有序的序列。也就是先要保證小範圍的資料有序,再使大範圍的序列有序。因此,若要使用歸併排序對乙個序列進行排...

四 歸併排序 非比較排序 歸併排序 計數排序

基本思想 歸併排序 merge sort 是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列 即先使每個子串行有 序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。歸...