目錄
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成為分界節點