利用二分思想,劃分左右區間,並讓左右區間排序完成後,進行合併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]); } }