zoukankan      html  css  js  c++  java
  • 快速排序-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一直爽





    心之所愿,永不相忘
  • 相关阅读:
    简单 dp 题选做
    UVa11327
    Codeforces Round #641 (div.2) 题解
    新博客
    数位dp的学习
    stl粗略用法
    cf437C The Child and Toy
    poj1995 Raising Modulo Numbers
    Tarjan的学习
    最短路模板
  • 原文地址:https://www.cnblogs.com/zgll/p/11146817.html
Copyright © 2011-2022 走看看