leetcode 324. Wiggle Sort II【如何锯齿状排序】

时间:2021-03-05 23:46:47

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];

}