508. Wiggle Sort
Tag:
Quick Sort, Sort, Array
Description:
Given an unsorted array nums, reorder it in-place such that
nums[0] <= nums[1] >= nums[2] <= nums[3]…
Main Idea:
The main idea is to discuss when index is odd or even. When index is odd, it should be nums[i-1] < nums[i] > nums[i+1]; When index is even, it should be nums[i-1] > nums[i] < nums[i+1]. If the condition is not satisfied, swap nums[i] with nums[i-1].
Time/Space Cost:
Time Cost:
Space Cost:
Code:
class Solution {
public:
/*
* @param nums: A list of integers
* @return: nothing
*/
void wiggleSort(vector<int> &nums) {
// write your code here
for(int i = 1; i < nums.size(); i++)
{
// when index is odd, it should be nums[i-1] < nums[i] > nums[i+1]
// when index is even, it should be nums[i-1] > nums[i] < nums[i+1]
if( (i%2 == 1 && nums[i] < nums[i-1]) ||
(i%2 == 0 && nums[i] > nums[i-1]))
swap(nums, i, i-1);
}
}
void swap(vector<int> &nums, int i, int j){
int tmp = nums[i];
nums[i] = nums[j];
nums[j] =tmp;
return;
}
};
Follow-up Problem: 507. Wiggle Sort II
Description:
Given an unsorted array nums, reorder it such that
nums[0] < nums[1] > nums[2] < nums[3]…
Main Idea:
The main ides is partition the array by median. Then left part is smaller than median, while the right part is larger than median.
Tips/Notes:
Time/Space Cost:
Time Cost:
Space Cost:
Code:
class Solution {
public:
/*
* @param nums: A list of integers
* @return: nothing
*/
int QuickSort(vector<int> &nums, int start, int end) {
if(start >= end) {
return nums[start];
}
int mid = nums[start + (end - start)/2];
int left = start, right = end;
while(left <= right) {
while(left <= right && nums[left] < mid) {
left++;
}
while(left <= right && nums[right] > mid) {
right--;
}
if(left <= right) {
swap(nums[left], nums[right]);
left++; right--;
}
}
if(right >= nums.size()/2) {
return QuickSort(nums, start, right);
}
else if(left <= nums.size()/2) {
return QuickSort(nums, left, end);
}
return nums[nums.size()/2];
}
void wiggleSort(vector<int> &nums) {
// write your code here
int mid = QuickSort(nums, 0, nums.size() - 1);
int i = 0;
int o = 1;
int e = (nums.size()-1) % 2 == 0 ? nums.size()-1 : nums.size()-2;
while (i < nums.size()) {
if (nums[i] > mid && (i % 2 == 0 || i > o)) {
swap(nums[i], nums[o]);
o += 2;
continue;
}
if (nums[i] < mid && (i % 2 == 1 || i < e)) {
swap(nums[i], nums[e]);
e -= 2;
continue;
}
i++;
}
}
};