1.前后两指针互换
void Qrank(vector<int>& nums,int start,int over){
if(start>=over) return;
int left=start;
int right=over;
// int rdm = rand() % (over - start + 1) + start; // 随机选一个作为我们的主元
// swap(nums[rdm],nums[over]);
while (left<right){
while(nums[left]<=nums[over]&&left<right) left++;
while(nums[right]>=nums[over]&&left<right) right--;
swap(nums[left],nums[right]);
}
// if(nums[l]>=nums[r]){
swap(nums[left],nums[over]);
// }else{l++;//l=end,nl>=nr
// }
Qrank(nums,start,left-1);
Qrank(nums,left+1,over);
}
2.快慢指针,i遍历指针,k必然停留在大于pivot的点之前,如果之后没有小于pivot的点则k在中点左侧
void Qrank2(vector<int>& nums,int start,int over){
if(start>=over) return;
int i=start;
int k=start-1;
while(i<over){
if(nums[i]<nums[over]){
k++;
swap(nums[i],nums[k]);
}
i++;
}
swap(nums[k+1],nums[over]);
Qrank2(nums,start,k);
Qrank2(nums,k+2,over);
}
};