so true

心怀未来,开创未来!
随笔 - 160, 文章 - 0, 评论 - 40, 引用 - 0
数据加载中……

partition of quick sort

    int partition(vector<int>& nums, int i, int j) {
        int pivot = i++;
        while (true) {
            while (i <= j && nums[i] <= nums[pivot]) ++i; //a
            while (j >= i && nums[j] >= nums[pivot]) --j; //b
            if (i > j) {
                break;
            }
            int t = nums[i]; nums[i++] = nums[j]; nums[j--] = t; //c
        }
        int t = nums[j]; nums[j] = nums[pivot]; nums[pivot] = t;
        return j;
    }
上面这段代码里,细节太多太多,居然搞了一晚上才搞出来,总的来说大方向上:
1. 要确保最后能i > j才能终止(其实终止的时候,是一定满足j + 1 == i的);
2. 因为保留的是最左侧的数为基准,排序目标是从左到右按照从小到大排,因此最后要把pivot和j交换;
3. //a和//b里,其实只要有一个nums[i]/nums[j]和nums[pivot]的等于判断就可以了,这里为了一致性,都保留了对等于的判断;
4. //c里增加了i和j各自挪一步的操作,因此如下写法更好:
    int partition(vector<int>& nums, int i, int j) {
        int pivot = i++;
        while (true) {
            while (i <= j && nums[i] <= nums[pivot]) ++i;
            while (j >= i && nums[j] >= nums[pivot]) --j;
            if (i > j) {
                break;
            }
            swap(nums[i++], nums[j--]);
        }
        swap(nums[pivot], nums[j]);
        return j;
    }

posted on 2017-11-26 00:03 so true 阅读(158) 评论(0)  编辑  收藏 所属分类: C&C++


只有注册用户登录后才能发表评论。


网站导航: