classSolution { public: //插入排序法,小數量很穩 voidinsertSort(vector<int>& nums,int left , int right) { for(int i = left + 1; i <= right; i++) { int val = nums[i]; int j = i - 1; while(j >= left && nums[j] > val) { nums[j+1] = nums[j]; j--; } nums[j+1] = val; } }
//MergeSort,看網上TimSort資料這邊也有優化,似乎把一個一個檢查改成跳幾個檢查 voidmerge(vector<int>& nums,vector<int>& cpyBuff,int left , int mid , int right) { int leftn = 0,rightn; for(int i = left; i <= mid; i++) { cpyBuff[leftn] = nums[i]; leftn++; }
vector<int> sortArray(vector<int>& nums) { int n = nums.size(); int run = 32; //分割大小,稱為Run for(int i = 0 ; i < n; i += run) insertSort(nums,i,std::min(n - 1 , i + run - 1));
int cpySize = run; while(cpySize < n) { cpySize *= 2; } cpySize = cpySize >> 1; std::vector<int> cpyBuff(cpySize); for(int size = run; size < n ; size *= 2) { for(int i = 0; i < n; i += size * 2) { int mid = i + size - 1; if(mid >= n) continue; int right = std::min(n - 1 , mid + size);