快速排序的划分方法(5种)
自己做的笔记,来自看过的博客和刷题的时候的发现。
划分的方法
对于元素进行比较,只有三种结果 >/=/<
所以我们可以假设<pivot的元素是蓝色,==是白色,>是红色
数组划分完之后应该是 蓝/蓝白+pivot+红/红白
1、单指针从左向右扫描跳过 蓝白
最终划分结果: 蓝白混合+pivot+红
int partition(vector<int>& arr, int l, int r) {
int pivot = arr[l]; //最左元素 选为pivot
int pivot_pos = l;//先记录位置
while (l <= r) // 当左右指针交错时退出循环
{
if (arr[l] <= pivot)
++l;//遇到>pivot的元素(红色),就停下
else
{
swap(arr[l], arr[r]); // 否则左右指针内容交换
--r; // 右指针--
}
}
swap(arr[pivot_pos], arr[r]); // 退出循环时最后把pivot与r交换,此时l与r交错,l指向右部分第一元素,r指向左部分最后元素
return r;//返回当前pivot位置
}
void quickSort(vector<int>& arr, int begin, int end) {
if (end > begin) //递归终止条件,即只有一个元素,或 end<begin(<0,无元素)时退出
{
int pos = p