學習遞迴最開始就是斐波那契和歸併排序。核心思想就是遞迴地把序列分成兩部分,直到只剩乙個元素。然後將每次劃分的兩部分再遞迴地合併起來,合併時候的順序覺決定了排序的順序還是逆序。
劃分的過程可以看做是生成一顆葉子結點數為n的二叉樹,這個過程的複雜度為lgn(樹的高度)。而合併的過程是相當於將每層的節點數相加,複雜度為n*lgn。所以整體的複雜度為o(nlgn)。clrs裡給的複雜度分析方法是遞迴樹(recurve tree),還不是特別理解,需要再研究。**如下:
// mergesort.cpp : 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include #include using namespace std;
//合併
vectormerge(const vector&v1, const vector&v2)
; vectorv2 = ;
auto ans = merge(v1, v2);
for (auto i : ans)
cout << i << endl;
}//排序
void mergesort(vector& v,int n)
}int main()
; mergesort(a, a.size());
for (auto i : a)
cout << i << endl;
system("pause");
return 0;
}
執行結果:
歸併排序演算法簡單實現
using system using system.collections.generic using system.linq using system.text namespace mergesort mergesort refarr,0,arr.length 1 foreach int item...
簡單的歸併排序
第一篇 歸併排序就是一種分治法的思想,通過遞迴呼叫自身函式將原問題劃分為其子問題,再求解子問題,然後將子問題合併的過程。例如有序列,第一次呼叫劃分為和兩個堆,第二次呼叫劃分為,4個堆,第三次呼叫劃分為,到這一步劃分結束,即結束的標誌就是子串行只有1個元素,可以這樣理解,當子串行只有乙個元素時,我們認...
簡單的歸併排序
歸併排序 是利用歸併的思想實現的排序方法,該演算法採用經典的分治策略 分治法將問題分 divide 成一些小的問題然後遞迴求解,而治 conquer 的階段則將分的階段得到的各答案 修補 在一起,即分而治之 下面的很清晰的反映了 從下往上 和 從上往下 的歸併排序的區別。從上面的圖中可以看出,歸併的...