歸併排序(C 實現 遞迴 非遞迴)

2021-09-29 05:39:02 字數 2518 閱讀 6729

(本部落格旨在個人總結回顧)

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

c++遞迴和非遞迴實現:(一般遞迴轉為非遞迴,可以使用stack實現)

// mergesort.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include using namespace std;

/* * @name sort(有序和排序都為公升序)

* @brief 將左右為有序的陣列排序

* @param [in] int * punsortarray 左右兩部分已經為有序的待排序陣列

* @param [in] int nleft 左下標

* @param [in] int nmid 中間下標

* @param [in] int nright 右下標

* @param [in] int * psortarray 排序後放置的臨時陣列

* @return void

*/ void sort(int* punsortarray, int nleft, int nmid, int nright, int* psortarray)

else

}else if (nindex1 <= nmid)

else if (nindex2 <= nright)

}//排序完修改原陣列

for (int i = nleft; i <= nright; i++)

}void merge(int* punsortarray, int nleft, int nright, int* psortarray)

int nmid = (nleft + nright) / 2;

merge(punsortarray, nleft, nmid, psortarray);

merge(punsortarray, nmid + 1, nright, psortarray);

sort(punsortarray, nleft, nmid, nright, psortarray);}/*

* @name mergesortrecursion

* @brief 歸併排序遞迴實現

* @param [in] int * array 待排序陣列

* @param [in] int nlength 陣列長度

* @return void

*/ void mergesortrecursion(int* array, int nlength)

int* psortarray = new int[nlength];

merge(array, 0, nlength - 1, psortarray);

delete psortarray;}/*

* @name mergesortunrecursion

* @brief 歸併排序非遞迴實現

* @param [in] int * array 待排序陣列

* @param [in] int nlength 陣列長度

* @return void

*/ void mergesortunrecursion(int* array, int nlength)

int* psortarray = new int[nlength];

int nsize = 1;//分出的最小組

while (nsize <= nlength)

sort(array, nbegin, nmid, nend, psortarray);

nbegin = nend + 1;

}nsize *= 2;

}delete psortarray;

}int _tmain(int argc, _tchar* ar**)

; for (int i = 0; i < 100; i++)

int nlength = sizeof(a) / sizeof(a[0]);

cout << "排序前:" << endl;

for (int i = 0; i < 100; i++)

cout << endl;

cout << "come here" << endl;

mergesortunrecursion(a, nlength);

cout << "排序後:" << endl;

for (int i = 0; i < nlength; i++)

cout << endl;

system("pause");

return 0;

}

執行結果:

C 歸併排序 遞迴 非遞迴

遞迴的版本c 歸併的思想 先分到最小 在2 2合併並切排序 誰小誰插進臨時陣列的第一位 臨時index開始 class program mergesort arr,0,arr.length 1 for int i 0 i arr.length i 歸併排序 static void mergesort...

歸併排序 遞迴 非遞迴

首先簡單的介紹一下歸併演算法的核心思想 將我們將一組資料分成若干個組,即分到每組資料為1個元素的情況下就不用分了,然後在分別比較每兩組資料元素的大小,將其合併為一組資料再去和其他同等級別的組的資料元素取比較,然後合併到臨時的空間中然後在複製給原空間,依此類推,直到最後全部合併完畢,陣列就成為一組有序...

歸併排序 非遞迴實現

我們知道,遞迴實現的缺點就是會一直呼叫棧,而棧記憶體往往是很小的。所以,我們嘗試著用迴圈的辦法去實現歸併排序。之氣提到過,歸併排序的基本思路是將待排序序列r 0 n 1 看成是n個長度為1的有序序列,將相鄰的有序表成對歸併,得到n 2個長度為2的有序表 將這些有序序列再次歸併,得到n 4個長度為4的...