面试题 10.11. 峰与谷-快速排序
在一个整数数组中,“峰”是大于或等于相邻整数的元素,相应地,“谷”是小于或等于相邻整数的元素。例如,在数组{5, 8, 4, 2, 3, 4, 6}中,{8, 6}是峰, {5, 2}是谷。现在给定一个整数数组,将该数组按峰与谷的交替顺序排序。
示例:
输入: [5, 3, 1, 2, 3]
输出: [5, 1, 3, 2, 3]
这一题,我们进行快速排序后,对其进行交错重组就可以啦,注意重组的时候从最大值和最小值两边开始,解题代码如下:
void quick(int *a,int low,int high){
if(low<high){
int l=low,h=high,p=a[low];
while(low<high){
while(low<high&&a[high]>=p){
high--;
}
a[low]=a[high];
while(low<high&&a[low]<=p){
low++;
}
a[high]=a[low];
}
a[low]=p;
quick(a,l,low-1);
quick(a,low+1,h);
}
}
void wiggleSort(int* nums, int numsSize){
quick(nums,0,numsSize-1);
if(numsSize==0){
return ;
}
int t[numsSize];
for(int i=0;i<numsSize;i++){
t[i]=nums[i];
}
int low=0;
int high=numsSize-1;
for(int i=0;i<numsSize;i++){
if(i%2==0){
nums[i]=t[high--];
}
else{
nums[i]=t[low++];
}
}
}