python算法与数据结构-快速排序算法

设定一个中间值,如下所示:

low从开始位置找low是找比54小的,26比54小合格  high是从末尾位置找比54大的,如下所示:

low和high重合后第一轮循环结束

第一轮递归后的结果如下所示:

还需要处理值相等的情况,如下所示:

比如有一个值是54(也可能是多个),正好跟中间值也就是基准值相等,解决思路就是54在一边出现(或者说在一边处理),不是左边出现就是右边出现,把等于这个情况放到一边去处理,不是在low这边就是在high这边。

上面的high继续左移的时候,high和low就重合了。

上面的起始位置是动态的,不是固定的0,low-1这样的

代码如下所示:

# coding=utf-8
def  quick_sort(alist,first,last):
     """快速排序"""
     if first >= last: #这两个相等表示有一个元素,则终止循环即可。
         return
     #n = len(alist)
     #mid_value = alist[0]
     # low = 0
     # high = n - 1
     mid_value = alist[first]
     low = first
     high = last

         #high对应的值大于中间值的时候,high需要往左走,即high-=1,走到什么时候呢?即low和high没有相遇的时候,high的值需要一直走,所以外面又加了一层循环 while low<high:
     #流程是交替进行的,先是high走,high走完了然后是low走,然后又是high走,即左移右移左移依次交替进行,所以外面还需要套一层交替进行的代码
     while low<high:
         #这个是high往左移动过程的代码
         #中间值解决思路就是中间值54在一边出现(或者说在一边处理),不是左边出现就是右边出现。
#把等于这个情况放到一边去处理,不是在low这边就是在high这边,所以下面的alist[high] >= mid_value加了一个等号
         while low < high and alist[high] >= mid_value:
                 high -= 1
         #代码修改了一下,high往左移动,跳出while循环的时候,可以查看一下while循环的条件,可能是high往左走的过程中遇到了比中间值小或者等于中间值的情况,则需要把high的值赋予到low上面,low上面存的是比中间值小的数值
         alist[low] = alist[high]
         #low+=1 #因为low里面的值比中间值小,所以low需要加1,这样写有可能会错过low和high重合的情况,注释掉
         # 这个是low往右边移动过程的代码
         while low<high and alist[low]<mid_value:
                  low+=1
         alist[high] = alist[low]
         #high -= 1,这样写有可能会错过low和high重合的情况,注释掉
     #从循环退出时,low == high
     alist[low] = mid_value

     #对low左边的列表执行快速排序
     #这块low-1减的时候有可能比first小,所以停止执行的条件我们修改为first>=last
     quick_sort(alist,first,low-1)
     # 对low右边的列表执行快速排序
     quick_sort(alist,low+1,last)
if __name__ == "__main__":
        li = [54, 26, 93, 17, 77, 31, 44, 55, 20]
        print(li)
        quick_sort(li, 0, len(li)-1)
        print(li)
"""
[54, 26, 93, 17, 77, 31, 44, 55, 20]
[17, 20, 26, 31, 44, 54, 55, 77, 93]
"""

猜你喜欢

转载自blog.csdn.net/gb4215287/article/details/107361752