2021-11-3 排序问题之——快速排序

快速排序的基本思想是分治思想,每一次选取数组首元素作为pivot,将大于它的数放在右边,小于它的数放在左边。基本思路就是首先从右往左找到小于pivot的元素,然后再从左往右找到大于pivot的元素,这时如果两个元素再原数组中的位置为大的在左边,小的在右边,就对他们进行交换。

#include<iostream>
#include<vector>
using namespace std;
void partition(vector<int>& input,  int start, int end) {
    int left = start + 1, right = end;
    if (left > right) return;
    int pivot = input[start];
    //3 2 1 4 5
    //3 2
    while (left <= right) {
        while (left <= right && input[right] >= pivot) {
            right--;
        }
        while (left <= right && input[left] <= pivot) {
            left++;
        }
        if (left < right) swap(input[left], input[right]);
        //最后停在刚好小于pivot的地方,或者left==right
        //1.在第一个循环停止,停在刚好小于left的地方,input[right+1]>=pivot ,所以pivot和right换位置
        //2.在第二个循环停止,right停在小于pivot的地方
        }
        swap(input[start], input[right]);
        partition(input, start, right - 1);
        partition(input, right + 1, end);
    
}
int main(){
    vector<int>input = { 5,4,3,2,1 };
    partition(input, 0, input.size() - 1);
    for (int i = 0; i < input.size(); i++) {
        cout << input[i] <<" ";
    }
    return 0;
}

主要是要记住一些边界问题,没事就多写几遍吧。

又写了一遍

#include<iostream>
#include<memory>
#include<vector>
using namespace std;
void quicksort(vector<int>& arr, int start, int end) {
    int left = start + 1, right = end;
    if (left > right) return;//说明分段中只有一个元素
    int pivot = arr[start];
    
    
    while (left <= right) {
        while (left <= right && arr[right] >= pivot) right--;//从右往左寻找小于pivot的元素
        while (left <= right && arr[left] <= pivot) left++;
        if (left < right) swap(arr[left], arr[right]);
    }
    //2,1
    //最后pivot的位置应该在right,因为无论如何,right停留的位置会小于pivot
    //如果在第一个循环出来,说明right=left-1。
    swap(arr[start], arr[right]);
    quicksort(arr, start, right - 1);
    quicksort(arr, right + 1, end);
}
int main(){
    vector<int>input = { 1,2,6,5 };
    quicksort(input, 0, input.size() - 1);
    for (int i = 0; i < input.size(); i++) {
        cout << input[i] <<" ";
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值