1. 程式人生 > 資訊 >民營企業能否建設 5G 鐵塔並出租給運營商?工信部迴應

民營企業能否建設 5G 鐵塔並出租給運營商?工信部迴應

歸併排序

歸併排序(merge sort) 是利用歸併的思想實現的排序演算法,該演算法採用經典的分治(divide-and-conquer)策略。

分治法將問題分(divide)成一些小的問題然後遞迴求解,而治(conquer)的階段則將分的階段得到的答案修補在一起,即分而治之。

演算法思想

​先把這個要排序的陣列劃分為兩份,然後再把子陣列再次二分,直到陣列的大小為1;然後從低端開始向上合併,合併的過程對每一個子陣列進行排序。

演算法步驟

  1. 確定分界點:mid = l + r >> 1;
  2. 遞迴排序左右兩個子區間
  3. 歸併——合二為一:合併的過程對每一個子序列進行排序。(用到雙指標演算法)

其中最重要的就是第三步:歸併

歸併的過程:

程式碼模板

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陣列拷貝到原陣列中
}