快速排序 Quick Sort 的 思维过程

实现升序排序的 python 代码
def sort(nums):
    quit_sort(nums, 0, len(nums) - 1)
    return nums

def quit_sort(nums, l, r):

    if r <= l:
        return
     # 现在左右两边找到分割点,使得分割点左边都比较小,分割点右边都比较大
    j = partition(nums, l, r)
    quit_sort(nums, l, j - 1)
    quit_sort(nums, j + 1, r)

def partition(nums, l, r):

    i = l + 1
    j = r

    v = nums[l]

    while True:

        # 向右遍历,找到大于 v 的值索引,需要排除等于的情况
        while nums[i] <= v:
            i += 1
            if i == r:
                break

        # 向左遍历,找到 小于 v 的值的索引,需要排除等于的情况
        while v < nums[j]:
            j -= 1
            if j == l:
                break
        
        # 如果相遇过,则退出
        if i >= j:
            break
            
        # 否则交换 
        nums[i], nums[j] = nums[j], nums[i]
    
    # 最后把 对比元素 v 放在 j 的位置上。Q:为什么不放在 i 的位置上 
    # 因为 j 指向小于 v 的位置,根据 左小右大 的原则,把 v 放在 j 的位置更好 
    nums[l], nums[j] = nums[j], nums[l]

    return j
双指针的滑动逻辑和过程

选取第一个元素 v 作为基准, i i i 从左向右滑动,直到找到大于 v 的位置, j j j 从右向左滑动,直到找到 小于 v 的位置,如果此时 i i i j j j 还未相遇,则交换两者的值,然后 i i i 继续寻找下一个大于 v 的位置,j 继续寻找下一个小于 v 的位置, 当 i i i j j j 相遇后,即 i ≥ j i \geq j ij 时,则停止,此时 j j j 指向了小于 v 的位置,而我们做的是升序排序,所以 v 和 j 指向的位置的值进行交换,能把更小的值放在前面。完成这一阶段的排序。此时 v 已经在他正确的位置了,因为左边的值都比他小,右边的值都比他大,最后以 j 为分割点,递归排序左边和右边即可完成整个数组的排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值