题意:
随意给出一列数,把他变成大小上下振荡的序列。
思路:
先排序,分成前后两部分,再两两匹配,形成一大一小的数对。
先上WA的代码:
int cmp(const void *a, const void *b){
return *(int*)a-*(int*)b;
}
void wiggleSort(int* nums, int numsSize) {
int i=0,j=0,k=0;
int r[numsSize];
qsort(nums,numsSize,sizeof(int),cmp);
if(numsSize%2==0){
j=numsSize/2;
}
else{
j=numsSize/2+1;
}
for(k=0,i=0;k<numsSize;++k){
if(k%2==0){
r[k]=nums[i];
++i;
}
else{
r[k]=nums[j];
++j;
}
}
for(i=0;i<numsSize;++i){
nums[i]=r[i];
}
return;
}
这个 代码是从小到大遍历的。虽然可以保证一对数的大小关系,但是相邻数对的大小关系无法保证。如[4,5,5,6]。
这是通过的代码:
int cmp(const void* a, const void* b){
return *(int*)a-*(int*)b;
}
void wiggleSort(int* nums, int numsSize) {
int i=0,j=0,k=0;
int r[numsSize];
for(i=0;i<numsSize;++i){
r[i]=nums[i];
}
qsort(r,numsSize,sizeof(int),cmp);
for(i=(numsSize+1)/2-1,j=numsSize-1;j>(numsSize+1)/2-1||i>=0;--j,--i){
if(k<numsSize&&i>=0){
nums[k]=r[i];
++k;
}
if(k<numsSize&&j>(numsSize+1)/2-1){
nums[k]=r[j];
++k;
}
}
return;
}
这个代码是从大到小遍历的。既可以保证一对书直接的大小关系,也可以保证相邻数对的大小关系。
这两个代码产生的数对是形同的,数对的排列方式不同。前者是由小到大,后者是由大到小。