1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| class Solution { public: void wiggleSort(vector<int>& nums) { int n = nums.size(); if(n <= 1) return; quickSort(nums, 0, n - 1, (n + 1) / 2); auto midPtr = nums.begin() + (n + 1) / 2; int midNum = *midPtr; int i = 0, j = 0, k = n - 1; while(j < k) { if(nums[j] > midNum) swap(nums[j], nums[k--]); else if(nums[j] < midNum) swap(nums[j++], nums[i++]); else ++j; } vector<int> A(nums.begin(), midPtr); vector<int> B(midPtr, nums.end()); for(int i = A.size() - 1, j = 0; i >= 0; j += 2, --i) nums[j] = A[i]; for(int i = B.size() - 1, j = 1; i >= 0; j += 2, --i) nums[j] = B[i]; } private: void quickSort(vector<int>& nums, int lo, int hi, int n) { if(lo > hi) return; auto pivot = rand() % (hi - lo + 1) + lo; swap(nums[pivot], nums[lo]); int c = nums[lo]; int i = lo, j = hi + 1; while(i < j) { while(i < hi && nums[++i] <= c) {} while(j > lo && nums[--j] >= c) {} if(i >= j) break; swap(nums[i], nums[j]); } swap(nums[lo], nums[j]); if(j < n) quickSort(nums, j + 1, hi, n); else if(j > n) quickSort(nums, lo, j - 1, n); else return; } };
|