快排优化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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux查看redis命令,linux查看redis版本怎么操作?具体示例

    linux查看redis命令,linux查看redis版本怎么操作?具体示例对于有相关开发经验的朋友来说,linux作为一套免费使用和自由传播的类UNIX操作系统,相信你们肯定是比较亲切的,那么今天我们一起了解的是,怎么用linux查看redis版本号?工具/原料:linux,redis方法/步骤:登录Linux服务器,使用命令:whereisredis查找到redis的安装目录。用cd命令进入该目录。进入该目录下的bin目录。使用ls命令列出该目录下的文件结构,可以发…

    2022年6月7日
    117
  • 蒲式耳,磅换算成公斤和吨

    蒲式耳,磅换算成公斤和吨一个小东西,给自己留作备份用的<!DOCTYPEhtml><htmllang="en"><head><metacharset

    2022年8月3日
    2
  • 远程控制木马原理_安卓远程控制木马

    远程控制木马原理_安卓远程控制木马 导读:刘东发(http://www.codelive.net)的杰作——–远程控制木马”偷窥者”VC6.0编译通过。2001年是中国的木马大丰收的一年. 首先是灰鸽子的诞生.灰鸽子早期版本开放源代码,灰鸽子的作者葛军(俺安徽的老乡,呵呵可不是拉关系),开始还倒不错,开放了源代码,后来功能齐全后,葛军开始翻脸了,不但不公开源代码,还收费.灰鸽子是delphi版的,本人愚

    2025年6月16日
    1
  • 刮刮卡制作过程_微信怎么制作刮刮卡

    刮刮卡制作过程_微信怎么制作刮刮卡刮刮卡demo图样1.刮开涂层的绘制可以是画图,把涂层画上去varimageObj=newImage();imageObj.onload=function(){context.drawImage(imageObj,x,y,width,height);};imageObj.src=’path/to/my/image.jpg’;可以是是画灰色的区域co…

    2025年7月31日
    0
  • Java 继承(extends)详解

    Java 继承(extends)详解一、继承问题的引出继承性是面向对象的第二大主要特征。下面首先编写两个程序:Person类、Student类。Person类:classPerson{privateStringname;privateintage;publicvoidsetName(Stringname){

    2022年7月9日
    18
  • linux redis端口修改端口,linux–redis的安装和配置和开启多个端口「建议收藏」

    linux redis端口修改端口,linux–redis的安装和配置和开启多个端口「建议收藏」在workerman开发过程中需要安装redis来存储用户ip、端口等信息首先UBUNTU中安装redis:apt-update//更新apt包源apt-getinstallredis-server//安装redis-server安装完毕后可以直接启动redis:redis-server因为后面没有加启动哪个配置文件,所以redis会自启动默认的配置文件然后我们来看下redis的文件分布…

    2022年9月16日
    0

发表回复

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

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