曾格的github

快速排序-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一直爽





posted @ 2019-07-07 17:26  曾格  阅读(222)  评论(0编辑  收藏  举报
Live2D