演算法 歸併演算法的遞迴與非遞迴形式

2021-06-26 20:48:19 字數 1374 閱讀 9728

歸併演算法是將兩個或兩個以上的有序表組合成乙個新的有序表,它的原理是:假設初始序列含有n個記錄,則可以看成是n個有序子串行,兩兩歸併,得到[n/2]個有序子串行,再次歸併……不斷重複直至歸併到長度為n的有序序列,這樣的排序方法稱為2路歸併排序。

例項一:遞迴形式的2路歸併演算法

#define maxsize 4

int data[maxsize] = ;

/** 功能:將from陣列min到max-1下標資料排好序,最後的結果是to[min]...to[max-1]

* 輸出:無

*/void merge(int from,int to,int min,int m,int max)

/*由於子串行已經排好序,當上面的迴圈結束時,將還沒"溢位"的一側剩餘元素直接賦給後面的to*/

if(min <= m)

for(int k =0; k<=m-min; k++)

to[i+k] = from[min+k];

if(j <= max)

for(int k = 0; k <= max-j; k++)

to[i+k] = from[j+k];}/*

* 功能:不斷分組歸併

* 輸出:無

*/void msort(int from,int to,int min,int max)

}void print(int *data)

void main(int argc, char* argv)

列印結果:

由程式可以看出,每分組一次就要建立乙個臨時存放資料的陣列,這無疑會降低效能,所以可以採用非遞迴形式的歸併演算法。

例項二:非遞迴形式的2路歸併演算法

#include "stdio.h" 

#include "malloc.h"

#define maxsize 8

int data[maxsize] = ;

/** 功能:歸併排序,自下而上,不採取遞迴方式,而是通過演算法自下而上

* 輸入:待排序陣列,陣列元素個數

* 輸出:無

*/void merge_sort(int *list, int length)

} free(tmp);

}void main()

列印結果基本同上

歸併排序很重要的乙個思想是,在歸併的子串行是已經排好序的,這也是其中演算法的關鍵。歸併排序的時間複雜度是o(nlogn),處理大量資料時效能遠比簡單排序演算法要好,其中非遞迴歸併演算法的空間複雜度比遞迴歸併演算法的要小,整體效能較好。

遞迴與非遞迴演算法

一 題目分析 將非負十進位制整n轉換成b進製 其中b 2 16 將任意正整數n用2的冪次方表示 二 演算法設計 1 轉換進製問題 exer.cpp 遞迴演算法 遞迴出口 n b b 遞迴表示式 f n,b f n b,b n b b 遞迴棧表示 2 用二的冪次方表示任意正整數n問題 exer2.cp...

歸併演算法的遞迴和非遞迴實現

package sort public class mergesort int workspace new int sourcedata.length mergesort ms new mergesort ms.mergesort sourcedata,workspace,0,workspace.l...

歸併排序的遞迴形式與非遞迴形式 C 版

歸併排序的核心思想是分治法,即將待排序資料分成多個小塊,對每個小塊進行排序,然後在兩兩合併小塊,最終完成對整體的排序 時間複雜度是nlogn 輸入 25,12,17,21,15,48 結果 遞迴實現 遞迴類似於對此方法的場景再現,即先對整體進行劃分,然後對劃分後的部分進行排序 對遞迴函式的理解可以認...