# Merge sort O(1) extra space ## 概念 利用某個數 /MOD 與 %MOD 結果會不一樣且可控制的特性,可以讓陣列中的一個位置同時攜帶"原本數字"與"排序後結果"兩種資訊,並分別使用"/" 與"%"提取資訊 (MOD是除數,必須要大過待排序數字中的最大值) ->如此一來便可以在不使用額外陣列的情況下完成merge動作 例子在程式碼註解中 ## 程式碼(C++) ``` C++ #include <bits/stdc++.h> using namespace std; #define INF 0x3f3f3f3f #define MOD 2147483648 typedef unsigned long long int llt; void Merge(vector<llt>& a,int Front,int mid,int End) { // since number/MOD and number%MOD can be different number and they are independent // we can let an element of array contain both original value and sorted value // for example: // a=[3,4,6,1,2,5], Front=0,mid=2,End=5;[3,4,6],[1,2,5] has been sorted // in the end,a[0] shound be 1,so we temporary set a[0] to 2147483651,so that // a[0]/MOD=1,contain the sorted value // a[0]%MOD=3,contain the origin value int ptr1=Front,ptr2=mid+1; // the same as general merge sort int ans_ptr=Front; // remember what position to put the sorted value in while(1) { if(ptr1>mid || ptr2>End) { break; } if((a[ptr1]%MOD)<=(a[ptr2]%MOD)) { a[ans_ptr]=a[ans_ptr]+(a[ptr1]%MOD)*MOD; ptr1++; ans_ptr++; } else if((a[ptr1]%MOD)>(a[ptr2]%MOD)) { a[ans_ptr]=a[ans_ptr]+(a[ptr2]%MOD)*MOD; ptr2++; ans_ptr++; } } while(ptr1<=mid) { a[ans_ptr]=a[ans_ptr]+(a[ptr1]%MOD)*MOD; ptr1++; ans_ptr++; } while(ptr2<=End) { a[ans_ptr]=a[ans_ptr]+(a[ptr2]%MOD)*MOD; ptr2++; ans_ptr++; } for(int i=Front;i<=End;i++) //set to sorted value { a[i]=a[i]/MOD; } } void Merge_Sort(vector<llt>& a,int Front,int End) { if(Front>=End) { return; } else { int mid=(Front+End)/2; Merge_Sort(a,Front,mid); Merge_Sort(a,mid+1,End); Merge(a,Front,mid,End); } } int main() { //this progrem can deal with number range[0,2147483647]; //the only input is to deside how many numbers should be sorted default_random_engine generator(time(0)); uniform_int_distribution<int> distribution(0,2147483647); int n; int input; int random; vector<llt> a; cin>>n; for(int i=0;i<n;i++) { random=distribution(generator); a.push_back(random); } Merge_Sort(a,0,n-1); for(auto x:a) { cout<<x<<" "; } } ```