目录:
一:个人阅读完《算法图解》快速排序后写的代码
二:参考官方代码及个人总结
一:所谓分而治之(divide and conquer,D&C)是一种递归式解决方法
工作原理:(1)找出简单的基线条件(2)确定如何缩小问题规模使其符合基线条件
下面以一个例子来解释[源自算法图解]:
相信聪明的你看到这里大致就清晰了,如果还是不懂想看到最后可以找我给你pdf版的算法图解哈
(我本人是使用纸质的学习起来比较方便)
快速排序分析 :简言之就是给你一个列表 取一个元素作为基准值,大的放它左(右)边,小的放它右(左)边,再对两侧列表快速排序,再取基准值.....不断缩小规模
个人代码:
#基线条件 分区 def sorta(list): if len(list)==1: return list elif len(list)==0: return [] else: start,end=0,len(list)-1 mid=(start+end)//2 left,right=[],[] for i in list: if i!=list[mid]: if i<=list[mid] : left.append(i) else: right.append(i) return sorta(left)+[list[mid]]+sorta(right)
个人写的还是很冗长,对比了官方代码,总结了以下几点:
1:基准值的选取对排序影响不大,为简便起见选择首元素作为基准值(我一开始以为和对分查找有什么关系= =)
2:基线条件就是len(list)<2,一开始担心万一调用自身时传入的参数对报错(传入一个什么都没有的东西)后来发现 已经创建了left right>>list 那么经历基线条件是参数就没有问题
3:列表解析式会更加简洁效率更高!将四行代码换成一行0.0!!
#写法1 less=[i for i in array[1:] if i<=pivot] print(less) #下面是写法2: less=[] for i in array[1:]: if i<=pivot: less.append[i] print(less)
官方代码(宝藏) :
def quicksort(array): if len(array)<2: return array#每次递归调用自身 参数一定是列表 基线条件:单元素列表和空列表都返回自身 else: pivot=array[0]#选择哪个元素作为基准值都可以 less=[i for i in array[1:] if i<=pivot] greater=[i for i in array[1:] if i>pivot]#优势在于省去了append,因为‘分区’不包括mid,这里利用切片使得代码更加简介 return quicksort(less)+[pivot]+quicksort(greater) #print(quicksort([1,4332,43,2,-2,-9,100000])) #输出[-9, -2, 1, 2, 43, 4332, 100000]
好啦 我是小郑 希望和你在Python与编程的路越走越远