民營企業能否建設 5G 鐵塔並出租給運營商?工信部迴應
阿新 • • 發佈:2021-08-10
歸併排序
歸併排序(merge sort) 是利用
歸併
的思想實現的排序演算法,該演算法採用經典的分治(divide-and-conquer)
策略。分治法將問題
分(divide)
成一些小的問題然後遞迴求解,而治(conquer)
的階段則將分的階段得到的答案修補
在一起,即分而治之。
演算法思想
先把這個要排序的陣列劃分為兩份,然後再把子陣列再次二分,直到陣列的大小為1;然後從低端開始向上合併,合併的過程對每一個子陣列進行排序。
演算法步驟
- 確定分界點:mid = l + r >> 1;
- 遞迴排序左右兩個子區間
- 歸併——合二為一:合併的過程對每一個子序列進行排序。(用到雙指標演算法)
其中最重要的就是第三步:歸併
歸併的過程:
程式碼模板
C++程式碼
void merge_sort(int q[], int l, int r){ if(l >= r) return; //遞迴邊界 int mid = l + r >> 1; //確定分界點mid merge_sort(q, l, mid); //遞迴處理左序列 merge_sort(q, mid + 1, r); //遞迴處理右序列 int temp[r - l + 1]; //臨時陣列 int i = l, j = mid + 1, k = 0; //左右指標初始的位置 while(i <= mid && j <= r){ //歸併合二為一 if(q[i] <= q[j]) temp[k ++] = q[i ++]; else temp[k ++] = q[j ++]; } //退出迴圈的兩種情況:左半邊走完 或 右半邊走完 while(i <= mid) temp[k ++] = q[i ++]; //將左邊剩餘元素填充進temp陣列中 while(j <= r) temp[k ++] = q[j++]; //將右邊元素填充進temp陣列中 這兩個while語句 只會執行其中一個 for(int i = l, j = 0; i <= r; i ++, j ++) q[i] = temp[j]; //將temp陣列拷貝到原陣列中 }