python快速排序

1. 思路

  1. 从序列中任选一个元素(temp)作为中间数,
  2. 列表分为两部分,把所有比 temp小的数移动到它的左边,再所有比 temp大的数移动到它的右边(简单理解:左边都比temp小,右边都比temp大)
  3. 分别对左右两部分进行递归,直到左右两部分剩余一个元素

2. 举例

比如现在有列表: a = [6,7,4,1,8,5,3,9,2]

  1. 先从列表中找 6 作为中间数,将列表分为两部分(6的左边比6小,右边比6大)
    在这里插入图片描述
  2. 对于左半部分,重复第一步的操作
    在这里插入图片描述
    在这里插入图片描述
  3. 右半部分也是一样
    在这里插入图片描述

3. 详细步骤分析

列表: a = [6,7,4,1,8,5,3,9,2]

  1. 先从列表中找 6 作为中间数,将列表分为两部分(6的左边比6小,右边比6大)

在这里插入图片描述2. 左半部分

1. 在 [2, 3, 4, 1, 5, 6, 8, 9, 7] 基础上进行的
2. 左半部分为 2,3,4,1,5
3. 选择第一个元素 2 作为temp,将剩余元素分为 [1,2] 和 [4,3,5] 两个部分

在这里插入图片描述
1,2,4,3,5 的右半部分
[4,3,5]
在这里插入图片描述 3. 右半部分
在这里插入图片描述

4. 代码实现

# ① 列表分为两部分,大的在temp右 小的在temp左
def fun(data,left,right):
    temp = data[left]
    print('temp:',temp)
    while left < right:
            while left < right and data[right]>=temp: # 1. 从右边开始找比temp小的数
                right -=1 # 如果比temp大 就向左边走一步
            data[left] = data[right] # 把右边的值写到左边空位上
            print(data,'right  right下标:',right)
            while left<right and data[left]<=temp: # 2. 从左边开始找比temp大的数
                left+=1   # 如果比temp小 就向右边走一步
            data[right] = data[left] # 把左边的值写到右边空位上
            print(data,'left   left 下标:',left)
    data[left] = temp # temp归位
    print('temp归位:{}  temp下标{}:'.format(data,left))
    return left
# ② 分别对左右两部分进行递归
def quick_sort(data,left,right):
    if left<right:# 至少有两个元素
        mid=fun(data,left,right)
        print('----------------------')
        quick_sort(data,left,mid-1)
        quick_sort(data,mid+1,right)
# ③ 调用
a = [6,7,4,1,8,5,3,9,2]
print('排序前:',a)
# a = [6,1,2,7,9,3,4,5,10,8]
# a = [5,7,4,6,3,1,2,9,8]
quick_sort(a,0,len(a)-1)
print('排序后:',a)
def quick_sort(data):
    if len(data) < 2:
    	    return data
    else: 
    	    temp = data[0]  
    	    less = [i for i in data[1:] if i <= data[0]]
    	    greater = [i for i in data[1:] if i > data[0]]
    	    print(less + [temp] + greater)
    return quick_sort(less) + [temp] + quick_sort(greater)

a = [6,7,4,1,8,5,3,9,2]
print(quick_sort(a))

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1024节

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值