lintcode-507-摆动排序 II

507-摆动排序 II

给你一个数组nums,将它重排列如下形式
nums[0] < nums[1] > nums[2] < nums[3]....

注意事项

你可以认为每个输入都有合法解

样例

给出 nums = [1, 5, 1, 1, 6, 4],一种方案为 [1, 4, 1, 5, 1, 6].
给出 nums = [1, 3, 2, 2, 3, 1],一种方案为 [2, 3, 1, 3, 1, 2].

挑战

O(N)时间复杂度 O(1)额外空间

思路

使用快排,然后调整,调整的方法是找到数组的中间的数,相当于把有序数组从中间分成两部分,然后从前半段的末尾取一个,在从后半的末尾去一个,这样保证了第一个数小于第二个数,然后从前半段取倒数第二个,从后半段取倒数第二个,这保证了第二个数大于第三个数,且第三个数小于第四个数,以此类推直至都取完

code

class Solution {
public:
    /**
     * @param nums a list of integer
     * @return void
     */  
    void wiggleSort(vector<int>& nums) {
        // Write your code here
        int size = nums.size();
        if (size <= 0) {
            return;
        }
        vector<int> temp = nums;
        int k = (size + 1) / 2, j = size;
        sort(temp.begin(), temp.end());
        for (int i = 0; i < size; ++i) {
            nums[i] = i & 1 ? temp[--j] : temp[--k];
        }
    }
};
posted @ 2017-08-24 12:32  LiBaoquan  阅读(817)  评论(0编辑  收藏  举报