目录
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成为分界节点