package com.interview.array; import java.util.Arrays; /** * Date 03/23/2016 * @author Tushar Roy * * Convert an unsorted array into an array of form num[0] < num[1] > nums[2] < num[3].... * * Time complexity O(n) - This depends on KthElementInArray time * Space complexity O(1) * * https://leetcode.com/problems/wiggle-sort/ * https://leetcode.com/problems/wiggle-sort-ii/ */ public class WiggleSort { //looking for nums[0] < nums[1] > nums[2] < nums[3] and so on. public void wiggleSort2(int[] arr) { if (arr.length == 0) { return; } int k = arr.length/2; KthElementInArray kthElementInArray = new KthElementInArray(); kthElementInArray.kthElement(arr, k); int mid = arr[k]; int n = arr.length; int i = 0, j = 0; k = n - 1; while (j <= k) { if (arr[next(j, n)] > mid) { swap(arr, next(i++, n), next(j++, n)); } else if (arr[next(j, n)] < mid) { swap(arr, next(j, n), next(k--, n)); } else { j++; } } } //in this version we are looking for nums[0] <= nums[1] >= nums[2] <= nums[3] and so on. public void wiggleSort1(int[] nums) { boolean flag = true; for (int i = 0; i < nums.length - 1; i++) { if (flag) { if (nums[i] > nums[i + 1]) { swap(nums, i, i + 1); } } else { if (nums[i] < nums[i + 1]) { swap(nums, i, i + 1); } } flag = !flag; } } private int next(int index, int n) { return (2*index + 1) % (n | 1); } private void swap(int arr[],int low,int high){ int temp = arr[low]; arr[low] = arr[high]; arr[high] = temp; } public static void main(String args[]) { WiggleSort ws = new WiggleSort(); int input[] = {6, 2, 1, 6, 8, 9, 6}; ws.wiggleSort2(input); System.out.print(Arrays.toString(input)); } }