內部排序演算法4(歸併排序)

2021-07-31 11:23:23 字數 2886 閱讀 1816

將兩個有序表合成乙個新的有序表就是二路歸併。例如,在元素序列l中有兩個已經排好序的有序順序表l[

left

],..

.,l[

mid]

和l[m

id+1

],..

.,l[

righ

t],它們可以歸併成為乙個有序表,仍然存放於l[

left

],..

.,l[

righ

t]中。

在歸併排序中,用變數

i 和

j分別做

l 中兩個表的當前檢測指標,用變數

k做歸併後結果表l1

的當前存放指標。當

i 和

j都在兩個表的表長內變化時,根據相應的兩個元素的排序碼大小,依次把排序碼小的元素放到結果表中;當

i 與

j中有乙個已經超出表長時,將另乙個表中的剩餘部分照抄到結果表中。

來自:

//歸併排序標頭檔案

#pragma once

#include

typedef

int elementtype;

class merge

;merge::merge(int length)

inline

void merge::create()

std::cout

<< "input successful"

<< std::endl;

}inline

void merge::sort() //歸併排序,不斷的增大塊的大小,從1開始,一直到大於等於len

}inline

void merge::print()

std::cout

<< std::endl;

}merge::~merge()

inline

void merge::mergehelp(elementtype *&l1, elementtype *&l2, int left, int mid, int right) //兩個小塊進行合併,left是左塊的開始,mid是兩塊的分界線,right是右塊的盡頭

else

}while (i <= mid)

while (j <= right)

}inline

void merge::mergepass(elementtype *&l1, elementtype *&l2, int l) //l是歸併排序中每個子排序表的初始長度

if (i + l <= len - 1) //如果第二個表長不足l

else

//如果只剩下乙個表,直接複製就好}}

//歸併排序main檔案

圖示

//遞迴歸併排序標頭檔案

#pragma once

#include

typedef

int elementtype;

class merge

;merge::merge(int length)

inline

void merge::create()

std::cout

<< "input successful"

<< std::endl;

}inline

void merge::print()

std::cout

<< std::endl;

}inline

void merge::recursivesort()

inline

void merge::recursivesorthelp(int left, int right) //分治法

}}merge::~merge()

inline

void merge::mergehelp(elementtype *&l1, elementtype *&l2, int left, int mid, int right) //每兩個小塊進行合併

else

}while (i <= mid)

while (j <= right)

}

//遞迴歸併排序main檔案,採用分治法

mergepass做一趟二路歸併排序呼叫mergehelp函式2l

n 次,其中

l 是需要歸併子串行的長度,

n是整個序列的長度。而mergesort呼叫mergepass正好

⌈log2n

⌉ 次,而每次做mergehelp要執行比較o(

l)次,所以演算法總的排序碼比較次數為o(

nlog2n

) 。不論元素初始排列如何買這個時間的代價是不變的。

使用了乙個與原待排序元素陣列相同大小的輔助陣列,空間代價為o(

n)。歸併排序是穩定的。

注:本文參考書籍《資料結構精講與習題詳解—考研輔導與答疑解惑》,殷人昆編著,清華大學出版社。

4 內部排序 歸併排序

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

排序演算法(4) 歸併排序

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

4 歸併排序演算法

1 歸併排序 merge sort 基本思想 歸併排序法是將兩個或兩個以上的有序表合併成乙個新的有序表 即將待排序的序列分成若干個子串行,每個子串行是有序的,然後再把有序子串行合併為整體子串行 利用歸併的思想實現二路歸併排序的實現步驟 首先將整個資料表看成是n個有序子表,每個子表長度為1 當然有序啦...