Wiggle Sort II
Given an unsorted array nums
, reorder it such that nums[0] < nums[1] > nums[2] < nums[3]...
.
Example:
(1) Given nums = [1, 5, 1, 1, 6, 4]
, one possible answer is [1, 4, 1, 5, 1, 6]
.
(2) Given nums = [1, 3, 2, 2, 3, 1]
, one possible answer is [2, 3, 1, 3, 1, 2]
.
Note:
You may assume all input has valid answer.
这道题给了我们一个无序数组,让我们排成摆动数组,满足nums[0] < nums[1] > nums[2] < nums[3]...
。还举出例子。
首先应该对数组排序,然后再做调整。调整方法是找到数组中间的数,这样就把数组分成两段,从前一段末尾取一个数,从后一段末尾取一个数,一直这样取下去。这样取保证了第一个数小于第二个数,而第二个数大于第三个数
下面是C的写法
int cmp(const void *x,const void *y)
{return *(int *)x-*(int *)y;
}
void wiggleSort(int* nums, int numsSize) {
if(numsSize==0||nums==NULL)
return ;
qsort(nums,numsSize,sizeof(int),cmp);
int x=ceil(numsSize*1.0/2.0);
int *nums_1=(int *)malloc(sizeof(int)*numsSize);
int j=numsSize-1,k=0,i=x-1;
while(i>=0&&j>=x)
{ nums_1[k++]=nums[i--];
nums_1[k++]=nums[j--];
}
if(i==0)
{
nums_1[k++]=nums[i--];
}
for(i=0;i<numsSize;i++)
nums[i]=nums_1[i];
}