快速排序-Python
初学python,用python手写快排
1 # -*- coding:utf-8 -*- 2 # @Time :2019/7/7 15:08 3 # @Author :曾格 4 5 def quick_sort(blist,low,high): 6 if low<high: # 当只有一个元素时,不再递归 7 # 否则将产生索引越界问题 8 # 其实还会产生递归深度过大问题,不过会被索引越界遮盖 9 refer = blist[low] 10 i = low 11 j = high 12 while i<j: # 一次子序列排序 13 #先右移,不能先右移 14 # 如 54 26 93 ,,, 20 15 # 这样的话第一躺就是54 26 93 ,,,93了 16 while i<j and blist[j]>=refer: 17 j-=1 # 定位j 18 if i<j: 19 blist[i]=blist[j] 20 i+=1 # 准备从左往右移 21 while i<j and blist[i]<=refer: 22 i+=1 23 if i<j: 24 blist[j]=blist[i] 25 j-=1 26 # 一次子序列排序后 27 blist[i]=refer 28 quick_sort(blist,low,i-1) 29 quick_sort(blist,i+1,high) 30 return blist 31 32 if __name__=="__main__": 33 bl=[54,26,93,17,77,31,44,55,20] 34 high=len(bl)-1 35 print(quick_sort(bl,0,high))
总结:1,if low<high: 语句=》在写快排时这个判断我是最后才加上去,当时想的是子序列为一个元素时,就不用进行递归和赋值了,从头到尾都没考虑过要设置递归出口(实际上写递归算法,递归出口是首先就要考虑的)
2,当选取左端点为比较值时,应该从右端开始比较;反之,从左端开始比较(快排有2个版本,可能还不止两个,这个版本是最容易理解的,这版本的 i 是从下标为0开始的)
另一个版本的 i 是从1开始的,并且当选择比较值为左端点时,是从左边开始比较;这个版本的快排我没写过
3,debug功能挺适合排序类算法。我在debug时,主要在print行和quick_sort(blist,low,i-1)行设置了断点,搭配step into和step out能很快地跟踪到每一步的排序结果和变量值 。从前写PHP没调试过,现在才发现,一直debug一直爽
心之所愿,永不相忘