快排优化Python表示「建议收藏」

基本快速排序分析以从小到大排序为例*选取一个主元(选取方式多样)*利用主元,将序列分为两个子序列,左侧都比主元小,右侧都比主元大。*对两个子序列重复此操作例如取第一个元素,代码表示如下:defqsort(arr):iflen(arr)<=1:returnarrelse:pivot=arr[0]r

大家好,又见面了,我是你们的朋友全栈君。

基本快速排序分析


以从小到大排序为例
* 选取一个主元(选取方式多样)
* 利用主元,将序列分为两个子序列,左侧都比主元小,右侧都比主元大。
* 对两个子序列重复此操作

快排图示

例如取第一个元素,代码表示如下:

def qsort(arr):
    if len(arr) <= 1:
        return arr
    else:
        pivot = arr[0]
        return qsort([x for x in arr[1:] if x < pivot]) + \
               [pivot] + \
               qsort([x for x in arr[1:] if x >= pivot])

优化方案

  1. 主元的选取
    上面的算法有很大的问题,对于升序或降序序列,效率很差,我优化后的方式是主元取序列首中尾
    三个值取平均数,网上有些取三个值的中值的,我认为没必要,为了效率还要将中值换到首或尾。
  2. 序列中可能有一些和主元相等的元素,上面直接将其并入子序列中了,最好是将其和主元聚集
    在一起,子序列缩减幅度也会更快

这样的话定义一个函数:

def getMidNum(list):
    return (list[0] + list[len(list) - 1] + list[len(list)/2])/3
def qsort(arr):
    if len(arr) <= 1:
        return arr
    else:
        pivot = getMidNum(arr)
        return qsort([x for x in arr[0:] if x < pivot]) + \
               [x for x in arr[0:] if x == pivot] + \
               qsort([x for x in arr[0:] if x > pivot])        

对比

分别构造长度为10000的随机数列表,升序列表,将序列表和等值列表,对比二者的表现

方法\序列 随机 升序 降序 等值
快排 1.3990s limit exceed limit exceed limit exceed
优化 0.6570s 0.9410s 0.9900s 0.0699s
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/128902.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • wifi数据包解析_解析WiFi数据包(libpcap)

    wifi数据包解析_解析WiFi数据包(libpcap)我一直在努力使OpenWRT路由器将WiFi探测器请求发送到MySQL数据库(它存储每个探测请求数据包的MAC地址和RSSI信息以及其他路由器特定的数据).在对libpcap进行了大量的研究之后,我已经能够拼凑一个基本的小程序,只需使用过滤器表达式(‘wlansubtypeprobe-req’)在监视器界面(mon0)上嗅探数据包,然后打印出原始数据包在十六进制.使用libpcap上可以在线获…

    2022年7月21日
    11
  • 数据库建表语句的使用及简单实战教程_SQL数据库建立一个表

    数据库建表语句的使用及简单实战教程_SQL数据库建立一个表目录介绍需求思路思路1:一张表来表示所有数据(如下图)思路2:两张表,学生表和班级表(如下图)代码扩展1.数据库设计三范式1.数据库表中不能出现重复记录,每个字段是原子性的不能再分(不可重复,不可再分)2.第二范式是建立在第一范式基础上的,另外要求所有非主键字段完全依赖主键,不能产生部分依赖3.建立在第二范式基础上的,非主键字段不能传递依赖于主键字段。(不要产生传递依赖)2.经典的数据库设计框架–er图介绍本文将用一个简单的tip来简单介绍建表语句,可以作为建表语句的模板使用需求采集一个学校中学生

    2022年9月8日
    3
  • HTML5实现IP Camera网页输出

    HTML5实现IP Camera网页输出

    2022年1月26日
    70
  • Android Studio中 HAXM安装失败的问题(Intel HAXM installation failed. To install Intel HAXM follow the…)

    Android Studio中 HAXM安装失败的问题(Intel HAXM installation failed. To install Intel HAXM follow the…)AndroidStudio:IntelHAXMinstallationfailed.ToinstallIntelHAXMfollowtheinstructionsfoundat:xxxxHAXM:Thesystemrequirementsarenotsatisfied

    2022年6月28日
    287
  • Python如何生成随机数_产生随机数的常用方法

    Python如何生成随机数_产生随机数的常用方法Python生成随机数的方法这篇文章主要介绍了Python生成随机数的方法,有需要的朋友可以参考一下如果你对在Python生成随机数与random模块中最常用的几个函数的关系与不懂之处,下面的文章就是对Python生成随机数与random模块中最常用的几个函数的关系,希望你会有所收获,以下就是这篇文章的介绍。random.random()用于生成用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限。如果a>b,则生成随机数 1 n:

    2022年10月4日
    5
  • Python抓取数据_python抓取游戏数据

    Python抓取数据_python抓取游戏数据前言本文整理自慕课网"《Python开发简单爬虫》",将会记录爬取百度百科“python”词条相关页面的整个过程。抓取策略确定目标:确定抓取哪个网站的哪些页面的哪部分数据

    2022年8月2日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号