// Virtual Indexing and Three-Way Partition
void wiggleSort(vector<int>& nums) { // time: O(n); space: O(1)
int n = nums.size();
auto midptr = nums.begin() + n / 2;
nth_element(nums.begin(), midptr, nums.end());
int mid = *midptr;
#define A(i) nums[(2 * i + 1) % (n | 1)]
// virtual indexing
// i in A -> (2*i + 1) % (n | 1) in nums
// 0 -> 1
// 1 -> 3
// 2 -> 5
// large indices in A correspond to odd indices in nums
// small indices in A correspond to even indices in nums
int i = 0, j = 0, k = n - 1;
while (j <= k) {
if (A(j) > mid) {
swap(A(i++), A(j++));
} else if (A(j) < mid) {
swap(A(j), A(k--));
} else {
++j;
}
}
}