Python-实现快排

前言

快排作为一个经典的算法,基本上是大家耳熟能详的。它的基本思想也挺简单的,利用二分法,不断将给定的数划分为两组,比目标值大的和比目标值小的。第一次用它就是大一学C语言时书上的一个实现,写的有点绕,而且当时还不是太懂递归,看的迷迷糊糊,只是知道它的大致思想,但是直接写代码,却是各种问题不断。后面就基本都是用写好的库函数,也不太关心它的内部实现,但直到再次刷题要明确实现它时,还是卡了壳,所以这里就记录一下它的实现吧。

代码实现

def qsort(nums,begin,end):
    if begin>=end:
        return 
    target = nums[begin]
    l =begin
    r = end
    while l<r:
        while l<r and nums[r]>target:# 从右向左找,直到找到一个小于等于target的位置
            r-=1
        nums[l]=nums[r]# 把这个值赋值给最左边的位置
        while l<r and nums[l]<=target:# 然后从左往右找,直到找到一个大于target的位置
            l+=1
        nums[r]=nums[l]# 把这个值赋值给最右边的位置 
    nums[l]=target # 最后跳出循环的条件是l==r,这就是target需要插入的位置
    qsort(nums,begin,l-1)# 递归左半边
    qsort(nums,l+1,end)# 递归右半边
import random
nums = [random.randint(1,20)for _ in range(10)]
print(nums)
qsort(nums,0,len(nums)-1)
print(nums)

还有一个比较耗时但是比较pythonnic的版本:

def pqsort(nums):
    if len(nums)<=1:
        return nums
    t = nums.pop()
    left = [x for x in nums if x<=t]
    right = [x for x in nums if x>t]
    return pqsort(left)+[t]+pqsort(right)

总结

这样常见的算法,就是背也应该能默写出来,算是一种基础吧!所以后面还是多注重一下基础的积累!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值