## 分治(超基礎part) --- 分治 -> 分而治之 --- 所以很明顯 有兩part要實作 1.分 2.合 --- 最基礎運用 `merge sort` ---- 這個排序法應該很多人聽過了,就不多做介紹了 為什麼不用sort? 因為你正在學merge sort --- 完整程式碼 ---- 分:遞迴處理 每次都把前半及後半丟入函數 函數會自動回傳一個排好的vector 在底下實作合的部分就可以自動解決了 ---- ```cpp 1 vector<int> mergesort(vector<int> arr) { 2 3 int n = (int)arr.size(); 4 5 // 邊 界 條 件: 陣 列 長 度 等 於 1 6 if (n == 1) return arr; 7 8 // 遞 迴 排 序 左 半 邊 跟 右 半 邊 9 int mid = n/2; 10 vector<int> left, right; 11 for (int i = 0; i < n; i++) { 12 if (i < mid) left.push_back(arr[i]); 13 else right.push_back(arr[i]); 14 } 15 left = mergesort(left); 16 right = mergesort(right); 17 18 // 合 併 左 右 兩 半 邊 19 vector<int> sorted; 20 int Lptr = 0, Rptr = 0; 21 22 while (Lptr < (int)left.size() && 23 Rptr < (int)right.size()) { 24 25 if (left[Lptr] < right[Rptr]) { 26 sorted.push_back(left[Lptr]); 27 Lptr++; 28 29 } else { 30 sorted.push_back(right[Rptr]); 31 Rptr++; 32 33 } 34 35 } 36 37 while (Lptr < (int)left.size()) { 38 sorted.push_back(left[Lptr]); 39 Lptr++; 40 } 41 42 while (Rptr < (int)right.size()) { 43 sorted.push_back(right[Rptr]); 44 Rptr++; 45 } 46 47 return sorted; 48 49 } ``` ~~這是抄的,我懶得自己打~~ --- 額外思考:快速冪如何實作? 比merge sort簡單100倍,大約10~15行而已 hint 若b為偶數 $a^b = a^{\frac{b}{2}} * a^{\frac{b}{2}}$ hint 若b為奇數 $a^b = a^{\frac{b}{2}} * a^{\frac{b}{2}} * a$ ||c++會自動取整||
{"title":"分治(超基礎part)","description":"分治 -> 分而治之","contributors":"[{\"id\":\"04b05e67-b6a9-4c04-9235-c66acad9fe35\",\"add\":1310,\"del\":0}]"}
    10 views
   owned this note