python 快速排序

快速排序

基本思想

- 假设 数组 为 3 4 5 2 1
- 第一步 首先将数组分为两部分,假设选择一个值为  3
- 第二步 那么数组将会分为 2 1  和 4 5 两部分,数组 3 位于中间,不需要再做变化
- 第三步 递归   处理 数组 2 1,进入递归第二步,2 和 1 的位置将会进行变化
- 第四步 跳出递归,如果数组的开头 和 结尾一样大,表示这个数组已经为空,或者数组已经不需要再变化了

重点是如何处理第二步

- 设置两个指针,low 和 high
- low 从小到大,遍历数组
- high 从大到小,遍历数组
- 如果碰到一个数 大于 一开始选择的中间值,那么就将两个数据进行调换
- 如果,从大到小,从小到大,遍历完成了,已经没有值需要进行调换了,那么结束这一部分的处理

第三步调用函数名一样的函数,将分割好的起点和终点,作为参数传入

- 将数组A `3 4 5 2 1` 分为  ` 2 1` 和 `4 5`,分成子问题进行递归处理
def quick_sort2(arr, start, end):

    if start >= end:
        return arr

    # pivot = start
    low = start
    high = end
    # pos =
    p_value = arr[start]

    while low < high:
        while low < high and arr[high] >= p_value:
            high -= 1
        arr[low] = arr[high]

        while low < high and arr[low] <= p_value:
            low += 1
        arr[high] = arr[low]

    arr[high] = p_value
    # 此时 low 与 high 重叠, low == high
    # 此处 low 和 low -1 没有区别,因为low 位置的数据不会变化,处于中间值
    quick_sort2(arr, start, low)
    quick_sort2(arr, high+1, end)
    return arr
a = [22, 24, 8, 19, 11, 11, 13, 16, 19, 15, 14, 28, 12, 17, 18, 2, 17, 17]
b2 = copy.copy(a)
print(quick_sort2(a, 0, len(a) - 1))
a1 = sorted(b2)
if a1 == a:
    print("Yes, ", b2)
else:
    print("No ", a1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值