快速排序是一种in-place算法,主要有两步,三数中值排序和pivot插入。其写法比较经典,所以最好理解之后背下来
三数中值排序相对简单,要注意三个数比较的顺序
void median(vector<int>& nums, int left, int right, int mid){
if(nums[left]>nums[mid]) swap(nums[left], nums[mid]);
if(nums[left]>nums[right]) swap(nums[left], nums[right]);
if(nums[mid]>nums[right]) swap(nums[mid], nums[right]);
swap(nums[mid], nums[right-1]);
}
pivot插入程序:
i = left;
j = right-1;
while(i<j){
while(nums[++i]<nums[right-1]) {}
while(nums[--j]>nums[right-1]) {}
if(i<j) swap(nums[i], nums[j]);
}
swap(nums[right-1], nums[i]);
(关于为什么是in-place的算法,这里再BB一句:因为它是不断交换元素的位置,完整代码如下。而merge-sort就不是,需要第三个