分治法 排序

2022-08-13 23:18:18 字數 842 閱讀 2728

今天在用lua對一組資料進行排序,想起來很久沒有寫過演算法了,工作中對於資料進行排序時都是使用stl裡面的函式,比如sortqsort這些函式。忽然興致勃勃的想寫乙個演算法,表示自己沒有完全忘記演算法內容,所以選了乙個比較簡單的排序功能 -- 分治法排序

1.分治 -- 把元問題分割成相同的子問題,這步其實就是把問題的空間大小變小,比如本來要對10個數進行排序,我們把他分割成2組,每組5個進行排序(通常用遞迴的形式來分解問題)

2.子問題的解決: 比如上面的排序,就是把分割後的5個數進行排序

3. 合併:把子問題的結果進行合併

// 2: 子問題解決

void merge(int a, int l, int m, int r)

for (int i = 0; i < r_len; ++i)

int l_i = 0;

int r_i = 0;

for (int i = l; i <= r; ++i)

else if (l_i >= l_len)

else if (l_a[l_i] <= r_a[r_i])

else

}delete l_a;

delete r_a;

}// 1:分治

// 3:分治的結束返回其實就是子問題的合併

void mergersort(int a, int l, int r)

}// 測試用例

int a = ;

mergersort(a, 0, 4);

分治法排序

分治法排序 1 把大問題分為小問題 2 求每個小問題的解 3 和1反方向,把各個解合併起來 實現 1 啟用兩個快取,乙個放前半部份問題,乙個放後半部份問題 2 只用乙個大快取,用index的大小區分問題規模 include include void megre pre int pre,int fir...

分治法排序

include include define temp 10 int a temp int b temp void merge int low,int mid,int high else k while i mid while j high for i 0 i k i b low i a i int...

分治法排序

分治排序法的思想 簡單引入兩副已排好序的撲克牌,假設最上面的最小。則只需每次比較兩副牌的最上面那一張的大小,永遠取最小的,直到取完兩副牌為止。為了方便,在兩副牌的最後加入一張哨兵牌,值取為 include define inf 100000 using namespace std 合併 void m...