(本部落格旨在個人總結回顧)
歸併排序(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的...