排序

快速排序

算法思想

选取一个数字x对数组进行划分
划分规则:<x的放在左边,>=x的在右边。
划分结束,x的最终位置确定,原问题就转化为了x左右两边规模更小的相同的子问题,可以按照上述规则继续划分,直到划分的区间长度为1

C++实现

// 左闭右开
int partition(vector<int>& nums, int l, int r) {
    int index = rand() % (r - l) + l, small = l;
    swap(nums[l], nums[index]);
    // 小的交换到左边,small指向左区间的最后一个位置
    for(int i = l + 1; i < r; ++i) {
        if(nums[i] < nums[l]) {
            swap(nums[i], nums[++small]);
        }
    }
    swap(nums[l], nums[small]);
    return small;
}
void quick_sort(vector<int>& nums, int l, int r) {
    if(l >= r) return;
    int index = partition(nums, l, r);
    quick_sort(nums, l, index);
    quick_sort(nums, index + 1, r);
}

稳定性分析

不稳定,体现在两点

  1. 随机选取x
    假设数字全部相同,随机选取x之后再进行划分,x相对于其他元素位置发生了改变,不再稳定。
  2. 划分函数
    在划分过程中有下述状态:
    p | lower | higher | unvisited
    p指的是pivotallower指小于p的部分,unvisited指还未访问到,| 是分割线。
    例如:5 | 3 1 2 | 9 7 8 9 | 4 6 3
    这时遍历unvisited部分 刚到了4 (array[8]) 显然4<5 ,这是4应该从 unvisited 部分去到 lower 部分。 因此 higher部分第一个元素 9 (array[4])4互换。
    变成了这样:5 | 3 1 2 4 | 7 8 9 9 | 6 3
    注意!这时这个9 (array[4]) 被换到了 后面那个9 (array[7])的 后面。这就不稳定了。
    参考:
    知乎:知遥其实是德鲁伊
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值