void wiggleSort(vector<int>& nums) { vector<int> m_nums = nums; //find median int median = -1; if (nums.size() % 2 == 0) median = (findKthElem(nums, nums.size() / 2) + findKthElem(nums, nums.size() / 2 + 1)) / 2; else median = findKthElem(nums, (nums.size() + 1) / 2); //index rewriting #define A(i) (nums[(2*(i)+1)%(nums.size()|1)]) //three-way sort int i=0,j=0,k=nums.size()-1; while(j<=k) { if(A(j)>median)//j往前行进的条件是A(j)>median 或 A(j)=median;j之前都>=median { swap(A(i),A(j)); i++,j++; } else if(A(j)<median)//k往后行进的条件是:A(j)<median,k之后都<median { swap(A(j),A(k)); k--; } else j++; } }
// Find k'th element from A/B - idx starts from 0 double findKthElem(int A[], int m, int B[], int n, int k) { if (m>n) return findKthElem(B, n, A, m, k); if (!m) return B[k]; if (k == 0) return std::min(A[0], B[0]); int pa = std::min((k+1)/2, m); int pb = k+1-pa; if (A[pa-1] > B[pb-1]) return findKthElem(A, pa, B+pb, n-pb, k-pb); else return findKthElem(A+pa, m-pa, B, pb, k-pa); }
double findMedianSortedArrays(int A[], int m, int B[], int n) { if (!m) return (B[n/2]+B[(n-1)/2])/2.0; if (!n) return (A[m/2]+A[(m-1)/2])/2.0; if ((m+n)%2) { return findKthElem(A, m, B, n, (m+n)/2); } else { return (findKthElem(A, m, B, n, (m+n)/2)+ findKthElem(A, m, B, n, (m+n)/2-1)) / 2; } }
int findKthElem(vector<int> const &nums,int k) { int pivot = nums[rand()%nums.size()]; vector<int> lessThanK, geThanK; for (auto num : nums) { if (num < pivot) lessThanK.push_back(num); else if (num>pivot) geThanK.push_back(num); } int lt_pivot_num = lessThanK.size(), ge_pivot_num = geThanK.size(); if (k <= ge_pivot_num) return findKthElem(geThanK, k); else if (k > nums.size() - lt_pivot_num) return findKthElem(lessThanK, k - (nums.size() - lt_pivot_num)); else return pivot; };