Wiggle Sort II

medium array divide and conquer sorting quickselect

Problem

Reorder nums in place so that nums[0] < nums[1] > nums[2] < nums[3] > … (strictly).

Inputnums = [1, 5, 1, 1, 6, 4]
Output[1, 6, 1, 5, 1, 4]

def wiggle_sort(nums):
    s = sorted(nums)
    n = len(nums)
    half = (n + 1) // 2
    # smaller half (reversed) → even indices; larger half (reversed) → odd indices
    nums[0::2] = s[:half][::-1]
    nums[1::2] = s[half:][::-1]
    return nums
function wiggleSort(nums) {
  const s = [...nums].sort((a, b) => a - b);
  const n = nums.length;
  const half = (n + 1) >> 1;
  for (let i = 0, j = half - 1; i < n; i += 2, j--) nums[i] = s[j];
  for (let i = 1, j = n - 1; i < n; i += 2, j--) nums[i] = s[j];
  return nums;
}
class Solution {
    public void wiggleSort(int[] nums) {
        int[] s = nums.clone();
        Arrays.sort(s);
        int n = nums.length, half = (n + 1) / 2;
        for (int i = 0, j = half - 1; i < n; i += 2, j--) nums[i] = s[j];
        for (int i = 1, j = n - 1; i < n; i += 2, j--) nums[i] = s[j];
    }
}
void wiggleSort(vector<int>& nums) {
    vector<int> s = nums;
    sort(s.begin(), s.end());
    int n = nums.size(), half = (n + 1) / 2;
    for (int i = 0, j = half - 1; i < n; i += 2, j--) nums[i] = s[j];
    for (int i = 1, j = n - 1; i < n; i += 2, j--) nums[i] = s[j];
}
Time: O(n log n) (or O(n) with quickselect + virtual indexing) Space: O(n)