歸併演算法是將兩個或兩個以上的有序表組合成乙個新的有序表,它的原理是:假設初始序列含有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 結果 遞迴實現 遞迴類似於對此方法的場景再現,即先對整體進行劃分,然後對劃分後的部分進行排序 對遞迴函式的理解可以認...