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


相关推荐

  • 小程序子组件向父组件传值_小程序组件通信

    小程序子组件向父组件传值_小程序组件通信父组件页面是carts.wxml子页面是product.html子组件wxml代码<viewclass=’cartAllSel’bindtap=”bindSelectAll”><iconwx:if=”{{selectedAllStatus}}”class=’iconDel’type=’success’color=’#4D4D4D’size…

    2025年9月13日
    6
  • 使用Boostrap V4,左侧菜单栏可缩进,并根据屏幕宽度自适应大小。[通俗易懂]

    使用Boostrap V4,左侧菜单栏可缩进,并根据屏幕宽度自适应大小。[通俗易懂]使用Boostrap V4,左侧菜单栏可缩进,并根据屏幕宽度自适应大小。

    2022年4月21日
    43
  • git 重置用户名 密码信息

    gitclone时,权限不够。如fatal:unabletoaccess:TherequestedURLreturnederror:403可能原因是,你之前在本电脑使用过git.但是以前和现在又不是同一个账户。所以当你现在使用gitcloneurl时,默认使用以前的账户信息。所以出现没有权限的状况。解决方法:重置本机保留的gitconfig信息。…

    2022年4月8日
    242
  • 操作系统:银行家算法(C语言代码)详解

    操作系统:银行家算法(C语言代码)详解银行家算法流程图:银行家算法自然语言描述:设Requesti是进程Pi的请求向量,如果Requesti[j]=K,表示进程Pi需要K个Rj类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查:(1)如果Requesti[j]≤Need[i,j],便转向步骤2;否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。(2)如果Requesti[j]≤Available[j],便转向步骤3;否则,表示尚无足够资源,Pi须等待。(3)系统试探着把资源分配给进程Pi,并修改下面数据..

    2022年6月13日
    29
  • 按键精灵定位坐标循环_用按键精灵录制微信自动摇一摇脚本

    按键精灵定位坐标循环_用按键精灵录制微信自动摇一摇脚本金猪脚本(原飞猪脚本)以按键精灵教学为主,涉及UiBot,Python,Lua等脚本编程语言,教学包括全自动办公脚本,游戏辅助脚本,引流脚本,网页脚本,安卓脚本,IOS脚本,注册脚本,点赞脚本,阅读脚本以及网赚脚本等各个领域。想学习按键精灵的朋友可以添加金猪脚本粉丝交流群:554127455学习路上不再孤单,金猪脚本伴你一同成长.前面我们说了模拟器和应用app的安装,这里来说说另外一个重点,也是…

    2022年5月30日
    58
  • 智能小车资料源码大全下载_清翔智能小车资料

    智能小车资料源码大全下载_清翔智能小车资料今天给大家分享一下智能小车的资料,包括制作流程、原理图设计和源码等,不下于60辆智能小车的制作经验。其中历届智能小车的开发资料就有90个文件了。分享的智能小车类型包括:Bluetooth控制两轮小车;智能小车配套程序,循迹、红外避障综合程序资料大全;智能车系统解决方案;STM32两轮自平衡小车资料;STM32两轮自平衡小车系统毕设;自平衡小车控制(stc12+mpu6050程序);寻迹实验小车…

    2022年10月17日
    2

发表回复

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

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