快排的两个重要思想
1. 找到分界点,两边进行排序
2. 原地排序
我们遍历 p 到 r 之间的数据,将小于 pivot 的放到左边,将大于 pivot 的放到右边,将 pivot 放到中间。经过这一步骤之后,数组 p 到 r 之间的数据就被分成了三个部分,前面 p 到 q-1 之间都是小于 pivot 的,中间是 pivot,后面的 q+1 到 r 之间是大于 pivot 的。

原地排序

完整代码
class Solution {
public:
void sortColors(vector<int>& nums) {
quik_sort(0,nums.size()-1,nums);
}
// 快排
void quik_sort(int p,int r, vector<int>& nums) {
if(p>=r) return;
int q=partition(p,r,nums);
quik_sort(p,q-1,nums);
quik_sort(q+1,r,nums);
}
int partition(int p,int r,vector<int>& nums) {
// 函数作用是排序分成大于一部分和小于一部分
int pivot=nums[r];
int i=p;
for(int j=p;j<r;j++) {
if(nums[j]<pivot){
swap(nums[i],nums[j]);
i++;
}
}
swap(nums[i],nums[r]);
for(auto value: nums)
cout<<value<<" ";
cout<<endl;
cout<<i<<endl;
return i;
}
};

7788

被折叠的 条评论
为什么被折叠?



