Python 快速排序

Python 快排:

概念

拿到一组数,取一个中间数,把剩下的数分别放到该中间数的左边和右边,然后再用此方法对左右两组数字进行操作

以下面的数组举例:

取第一个数为中间数

设置两个游标,一个从左往右遍历,一个从右往左遍历,比中间值大的放到左边,比中间值小的放到右边,与中间值相等的位置不变,直到两个游标指向同一个数字为止,然后把取出的中间数放到游标所指的位置

因为当前左侧游标指的是已经取出的中间值,所以先从右侧游标开始遍历,如果遇到比32小的,放到左侧游标所指位置

下图可以看到,遍历到15的时候发现比中间值小,所以放到左侧游标位置,下一步左侧游标开始向右移动

移动到64的时候发现比中间值大,所以放到右侧游标位置,下一步右侧游标开始向左移动

以此类推,

最后走到78的位置的时候游标重合,下一步把中间值放到游标位置

可以看到,游标把数组分成了两部分,下面开始对游标左侧和右侧的数字进行相同的操作

先对左侧的数字进行比较,取出中间值15,右侧游标向左移动

游标重合,再把15放到重合处,然后对右侧数组做相同操作,我就不画了,下面代码实现

代码实现

# arr为比较的数组,first为左侧游标所指位置,last为右侧游标所指位置
def quicker_sort(arr, first, last):
    # 循环退出条件为连个游标指向同一位置(可以先跳过此行代码,先看下面的,到最后再看这行)
    if first >= last:return None
    mid_value = arr[first]   # 先确定中间值
    low = first  # 左侧游标
    high = last  # 右侧游标

    # 下面进入循环体,循环条件为左侧游标如果不小于右侧游标
    while low < high:
        # 进入右侧游标遍历,如果右侧游标所指的位置大于等于中间值,右侧游标向左移动一个位置
        while low < high and arr[high] >= mid_value:
            high -= 1
        arr[low] = arr[high] # 如果小于中间值,那么就放到左侧游标所指位置
        while low < high and arr[low] <= mid_value: # 左侧游标再向右移动
            low += 1
        arr[high] = arr[low] # 如果大于中间值,则放到右侧游标所指位置

    # 左侧游标不小于右侧游标时,说明两个游标指向了一个位置,所以把中间值放到整个位置
    arr[low] = mid_value
    # 现在中间值分割了左侧数组和右侧数组,下面用递归来对两侧数组进行相同操作
    quicker_sort(arr, first, low-1)
    quicker_sort(arr, low+1, last)


if __name__ == '__main__':
    arr = [23, 4, 1, 31, 53, 25, 0, -2, 132.2, 131.1]
    quicker_sort(arr, 0, len(arr)-1)
    print(arr)

到这就结束了,如果有写的不好不明白的地方,希望各位大佬可以多多指正

小声BB:毕竟我也是一个小菜鸡😁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值