快排是冒泡的一种优化,取一个中点,大于中点的数放在右边,小于中点的数放左边(根据题目需求决定),排完是中数的左右两边的数都是大于或小于,接下来以中数为界,左右各执行此操作,以此类推。
样例写法:
void quick_sort(vector<int> &nums, int l, int r) //1.029 //左闭右开
{
//左闭右开
if (l + 1 >= r) //数组只有一个数或者为空,直接返回
return;
int first = l, last = r - 1, key = nums[first]; //左闭右闭 5 2 3 4 1 1 2 3 4 5
while (first < last)
{
while (first < last && nums[first] <= key) //这一步的first<last可以省略
first++;
while (first < last && nums[last] >= key) //这一步不能省
last--;
if (first < last) //出循环时可能是first==last因此只有first<last才交换
{
swap(nums[first], nums[last]);
}
}
//*如果最后一次交换时,last=first+1,先进行first的循环,那么first=last退出循环,也不会进行交换,此时的first值大于key,直接交换就会出问题*
if(nums[first]<=key){
//确定first是不是小于key,小于则交换
swap(nums[l], nums[first