分治法之歸併排序(遞迴 分治)

2021-08-17 21:28:49 字數 1041 閱讀 6218

/*

歸併排序

思想:1.分而治之,將乙個無序的數列一直一分為二,直到分到序列中只有乙個數的時候,這個序列肯定是有序的,因為只有乙個數,然後將兩個只含有乙個數字的序列合併為含有兩個數字的有序序列,這樣一直進行下去,最後就變成了乙個大的有序數列

2.遞迴的結束條件是分到最小的序列只有乙個數字的時候

時間複雜度分析:

最壞情況:t(n)=o(n*lg n)

平均情況:t(n)=o(n*lg n)

穩定性:穩定(兩個數相等的情況,不用移動位置

輔助空間:o(n)

特點總結:

高效耗記憶體(需要乙個同目標陣列sr相同大小的陣列來執行演算法)

*/#include

#define max 1024

intsr[max],tr[max];

int merge(int sr,int tr,int s,int m,int t)//

sr代表兩個有序序列構成的序列,s表示起始位置,m表示兩個序列的分解位置,但是sr[m]仍是屬於前面乙個序列,t表示結束位置

else

}while(i<=m)//

當前面乙個序列有剩餘的時候,直接把剩餘數字放在tr的後面

while(j<=t)//

當後面乙個序列有剩餘的時候,直接把剩餘數字放在tr的後面

return0;

}//該函式要求sr是由兩個有序序列構成

void copy(int sr,int tr,int s,int t)//

把tr賦給sr

}int mergesort(int sr,int s,int

t)else

//表示從s到t只有乙個數字(s==t),或者沒有數字(s>t)

return0;

}int

main()

mergesort(sr,

0,n-1);//

公升序排列

for(i=0;i)

printf("\n

");return0;

}

技術在於分享

分治法之歸併排序

參考學習的地方 在演算法設計中,如果對遞迴過程只有 模型的認識而沒有清晰的實踐的認識,最佳實踐就是在給每一層的遍歷新增乙個輸出,這樣就 可以驗證並把握遞迴的實質了。拓展 這種學習思想可用於專案中的測試,以及其他高 大難問題的分解驗證。歸併排序 難點是merge函式的設計 簡化就是用乙個陣列接收比較結...

分治法,歸併排序

1.時間複雜度為o nlog n 非降序 package com.cn.insertion 歸併排序,採用分治法的策略 author administrator public class merge sort mergesort a,0,9 for int i 0 i a.length i 先分在和...

分治法(歸併排序)

分治法.cpp 定義控制台應用程式的入口點。include stdafx.h include include include define max 30 using namespace std int l max int r max void merge int a,int p,int q,int ...