前言
快排作为一个经典的算法,基本上是大家耳熟能详的。它的基本思想也挺简单的,利用二分法,不断将给定的数划分为两组,比目标值大的和比目标值小的。第一次用它就是大一学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)
总结
这样常见的算法,就是背也应该能默写出来,算是一种基础吧!所以后面还是多注重一下基础的积累!