摆动排序II
空间复杂度O(n),时间复杂度O(nlogn)
- 对原数组排序,得到排序后的辅助数组tmp
- 对原数组的偶数位下标从末尾元素开始填充
- 对原数组的奇数位下标从末尾元素开始填充
注意:不要从头开始填充,例如[5 4 5 6],从头开始是[4 5 5 6],而从尾开始是[ 5 6
5 4]
class Solution {
public:
void wiggleSort(vector<int>& nums) {
int n=nums.size();
sort(nums.begin(),nums.end());
int p=n-1;
vector<int> res(n,0);
for(int i=1;i<n;i=i+2)
{
res[i]=nums[p--];
}
for(int i=0;i<n;i=i+2)
{
res[i]=nums[p--];
}
nums=res;
}
};
或者排序可以采用三向切分法排序,找到中位数mid,把比 mid 大的数安排到 mid 左边,比 mid 小的数安排到 mid 右边。
int n=nums.size();
nth_element(nums.begin(),nums.begin()+n/2,nums.end());
int mid=nums[n/2];
int p0=0,p2=n-1,cur=0;
while(cur<=p2)
{
if(nums[cur]<mid)
{
swap(nums[cur++],nums[p0++]);
}
else if(nums[cur]>mid)
{
swap(nums[cur],nums[p2--]);
}
else
cur++;
}