快速排序法目录
初学快速排序法,所记笔记,日常温习所用。
快速排序法分析
快速排列理论分析
快速排序法是对冒泡法排序的改进,以得到更好的排序效果
所用的方法 双指针+递归
目的:达到升序排列
一个符合要求的升序排列的特点:数组中任一元素a,a的左边元素的数值都是小于a的,a的右侧数值都是大于a的。
通过这一特点,我们以一个元素为基准,一般以数组的第一个元素为基准,找到他在数组中所在的位置,以此往复,来达到排序的效果。
快速排序法图示
vector nums:
6 | 2 | 7 | 3 | 1 | 5 | 4 | 8 |
---|---|---|---|---|---|---|---|
i | j |
以上表格所示的nums为示例,首先选取nums[0]=6为基准,存入base_num=6中。
第一步:首先用指针j从nums.size()-1处开始向左遍历。指针i来寻找数组中小于6的数值,
6 | 2 | 7 | 3 | 1 | 5 | 4 | 8 |
---|---|---|---|---|---|---|---|
i | j |
第二步:将nums[j]给nums[i]赋值,此时nums[0]在base_num中,所以不会有影响。如下表所示
4 | 2 | 7 | 3 | 1 | 5 | 4 | 8 |
---|---|---|---|---|---|---|---|
i | j |
第三步:用指针i来从nums的0处向右遍历,来寻找数组中大于6的数值
4 | 2 | 7 | 3 | 1 | 5 | 4 | 8 |
---|---|---|---|---|---|---|---|
i | j |
第四步:将nums[i]赋值给nums[j],如下表所示。
4 | 2 | 7 | 3 | 1 | 5 | 7 | 8 |
---|---|---|---|---|---|---|---|
i | j |
重复:
第一步:然后再次将j向左遍历,找到第一个小于6的数
4 | 2 | 7 | 3 | 1 | 5 | 7 | 8 |
---|---|---|---|---|---|---|---|
i | j |
第二步:将此时的nums[j]赋值给nums[i],如下表所示
4 | 2 | 5 | 3 | 1 | 5 | 7 | 8 |
---|---|---|---|---|---|---|---|
i | j |
第三步:将i从左向右遍历,找到第一个大于base_num的数值,当i==j的时候,遍历结束,如下图所示,此时的i便为base_num所应该在的位置
如下表格所示:
4 | 2 | 5 | 3 | 1 | 5 | 7 | 8 |
---|---|---|---|---|---|---|---|
j or i |
第四步:,将base_num=6赋值给nums[i],如下表所示:
4 | 2 | 5 | 3 | 1 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|
j or i |
将base_num=6赋值给nums[i],如下表所示
4 | 2 | 6 | 3 | 1 | 5 | 7 | 8 |
---|---|---|---|---|---|---|---|
i | j |
这时,发现了一个有趣的事情,nums数组被6分成了两半,一半是小于6的,一半是大于6的,这是分别将左右两部分进行快排,也就是可以递归,最终便可以达到升序排列的效果。
快速排序法代码
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
void quickSort(vector<int>& nums, int begin, int end) {
if (begin >= end) {
return;
}
int base_num = nums[begin];
int i = begin;
int j = end;
while (i < j) {
while (base_num <= nums[j]&&j>i) {
--j;
}
nums[i] = nums[j];
while (base_num >= nums[i] && j > i) {
++i;
}
nums[j] = nums[i];
}
nums[i] = base_num;
quickSort(nums, begin, i - 1);
quickSort(nums, i + 1, end);
}
};
int main(){
vector<int> nums={6,2,7,3,1,5,4,8};
Solution s;
s.quickSort(nums,0,nums.size()-1);
}