快速排序

快排的代码难点一般在于停止循环的边界条件,这边给出一个不是从两边向中间遍历,而是单向遍历的代码,实现起来更加方便。

#include <ctime>
#include <cstdlib>
#include <algorithm>

using namespace std;

class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
        srand(time(0));
        sort(nums, 0, nums.size() - 1);
        return nums;
    }

    void sort(vector<int>& nums, int l, int r) { //对[l, r]进行排序
        if (r - l < 1)
            return;
        int flag = rand() % (r - l + 1) + l;
        swap(nums[flag], nums[r]); //将哨兵的值挪到右边
        int i,j;
        for (i = j = l; i < r; i++) { //i是遍历头,j是分隔处
            if (nums[i] < nums[r]) { //保证小于哨兵的都在j的左边,j及j向右>=哨兵
                swap(nums[j], nums[i]);
                j++;
            }
        }
        swap(nums[j], nums[r]);
        sort(nums, l, j - 1);
        sort(nums, j + 1, r);
    }
};
posted @ 2022-04-04 14:56  Unparalleled_Calvin  阅读(24)  评论(0编辑  收藏  举报