歸併排序

思路

利用二分思想,劃分左右區間,並讓左右區間排序完成後,進行合併ios

# include <cstdio>
# include <iostream>
# include <algorithm>
using namespace std;
# define MX 100005
/**************************/
int cparr[MX];

/// 歸併排序
void mergesort(int arr[], int l, int r) {
    if (l==r) return;
    int mid = (l+r)/2;
    mergesort(arr, l, mid);
    mergesort(arr, mid+1, r);
    // 左右數組已排序完成,合併
    int index = l;
    int tl = l, tr = mid+1;
    while(tl <= mid && tr <= r) {
        if (arr[tl] <= arr[tr]) cparr[index++] = arr[tl++];
        else cparr[index++] = arr[tr++];
    }
    while(tl<=mid) cparr[index++] = arr[tl++];  // 處理掉某一個數組沒處理完的
    while(tr<=r) cparr[index++] = arr[tr++];
    for (int i=l; i<=r; i++) arr[i] = cparr[i];  // 拷貝回原數組
}

int main() {
    int nums[6] = {5, 1, 1, 2, 0, 0};
    // stable_sort(nums, nums+6);
    mergesort(nums, 0, 5);
    for (int i=0; i<6; i++){
        printf("%d ", nums[i]);
    }
}
相關文章
相關標籤/搜索