目录
1.思路解析
2:代码展示
1.思路解析
使用双指针pre和cur
指针cur用于检测符合条件的数据
cur和pre数据发生交换用于将符合条件的数据(比key小)向左扔
一轮循环结束时,以pre为分界点,除去key,pre左边的数字整体比右边小
所以要将key和pre的指针和数据交换以达到”以key为分界点,key左边的数据整体比右边小“
2:代码展示
class solution
{
public:
void QuickSort(vector<int>& nums, int left, int right)
{
if (left > right) return;
int key = left;
int pre = left;
int cur = left + 1;
while (cur <= right)
{
if (nums[cur] < nums[key])//使用cur去进行数据的探测,
//达成条件的数据进行以下while循环
{
pre++;
swap(nums[pre], nums[cur]);//将比key小的数据向pre左扔之后,
//以pre为分界点,除去key,pre左边的数据整体比pre右边的数据小
}
cur++;
}
swap(nums[key], nums[pre]);
key = pre;//将key特殊处理,这样pre左边所有的数据都比pre右边的小
QuickSort(nums, left, key - 1);
QuickSort(nums, key + 1, right);
}
};
总而言之
分两种情况:
1:若cur<key,des和cur正常向后遍历即可
2:但当cur>key时,cur继续向后遍历,直至cur<key才会停下
//如果cur遍历到一串连续<key的数据,那么可将这一串数据整合视为一类东西(都小于key)
//我们的目的是在一轮循环中用cur将nums全部遍历一遍,将比key小的数字全部移动到key左,是key成为分界节点