LintCode508

来源:互联网 发布:手机锁机软件 编辑:程序博客网 时间:2024/06/06 02:05

摆动排序 

给你一个没有排序的数组,请将原数组就地重新排列满足如下性质

nums[0] <= nums[1] >= nums[2] <= nums[3]....
 注意事项

请就地排序数组,也就是不需要额外数组

样例

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

方法

第一种:奇数位上最大值小于偶数位上最小值,二者由中位数分开,则对数组进行排序,奇数位填充小于中位数的,偶数位填充大于中位数的即可

分析---就地排序,使用块排,平均时间复杂度O(nlogn),在排序好的数组中找到不符合条件的奇位数偶位数(即找到奇数位上比中位数小,偶

       位数上比中位数大),进行互换。

第二种:首先排序,互换相邻奇数偶数位即可(可举例验证)

分析---复杂度为排序+O(n)

代码

简易方法:

class Solution {
public:
    /**
     * @param nums a list of integer
     * @return void
     */ 
      
    void wiggleSort(vector<int>& nums) {
        // Write your code here
          for(int i = 1; i < nums.size(); ++i)
        if((i % 2 == 1 && nums[i] < nums[i - 1]) 
        || (i % 2 == 0 && nums[i] > nums[i - 1]))
            swap(nums[i - 1], nums[i]);
    }
};

快排代码如下:

class Solution {
public:
/**
* @param nums a list of integer
* @return void
*/
void quicksort(vector<int> &a, int low, int high)
{
if (low >= high)
return;
int first = low;
int last = high;
int key = a[first];
while (first < last)
{
while (first < last && a[last] >= key)
--last;
a[first] = a[last];
while (first < last && a[first] <= key)
++first;
a[last] = a[first];
}
a[last] = key;
quicksort(a, low, last - 1);
quicksort(a, last + 1, high);
}
void wiggleSort(vector<int>& nums) {
// Write your code here
quicksort(nums, 0, num.size());
}
};



原创粉丝点击