快排中的注意点

2020-06-07  本文已影响0人  鲜橙

首先把快排的原理搞懂https://blog.csdn.net/qq_28584889/article/details/88136498

但是在自己写的时候发现有几个地方容易掉坑,即代码中的注释处,对于其原因的解释应该再看一遍快排原理。

题目来自 leetcode - [912. Sort an Array]

class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
        quiksort(nums, 0, nums.size()-1);
        return nums;
    }
    
    void quiksort(vector<int>& nums, int left, int right) {
        if (left >= right)
            return;
        if (left < 0 || right > nums.size())
            return;
        
        int base = nums[left];
        int i = left; // 这里从left开始!!!
        int j = right;
        while(i < j){
            // 1. j(right)要先移动
            // 2. 注意base比较时的等于号
            while(base <= nums[j] && i < j){
                j--;
            }
            while(base >= nums[i] && i < j){
                i++;
            }
            std::swap(nums[i], nums[j]);
        }
        std::swap(nums[left], nums[i]);
        quiksort(nums, left, i-1);
        quiksort(nums, i+1, right);
    }
};
上一篇下一篇

猜你喜欢

热点阅读