美文网首页
Python中的快排优化

Python中的快排优化

作者: 张老虎 | 来源:发表于2016-03-18 15:03 被阅读297次

基本快速排序分析


以从小到大排序为例

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

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

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

相关文章

  • Python中的快排优化

    基本快速排序分析 以从小到大排序为例 选取一个主元(选取方式多样) 利用主元,将序列分为两个子序列,左侧都比主元小...

  • 快排

    快排快排优化

  • python 快排以及多种优化

    优化1:基准元素不再选择第一个元素,而是随机选择一个,这样避免了有序数组,时间复杂度最坏为log(n2) 的情况 ...

  • 快排的优化

    0 荷兰国旗 设置两个标志位begin和end分别指向这个数组的开始和末尾,然后用一个标志位current从头开始...

  • 2018-07-13

    快速排序算法 快排普通版本: 快排优化版本: 测试代码:

  • 数据结构:快速排序优化思路

    既然这是一篇主题思想为优化快排的文章,自然就不讨论关于快排的一些定义和基础性的问题,只说快排应该怎么优化。 快排为...

  • 快排及优化

    复杂度分析 快排最优的复杂度为o(nlogn)最差时的复杂度为正序或逆序时候,复杂度为o(n^2)因为采用递归,造...

  • 计算机基础

    数据结构 散列解决冲突的方法有那些? 三种熟悉的排序算法?简述快排过程以及冒泡、插入、快排的区别?以及如何优化快排...

  • 快速排序算法的实现( Golang 和 Python )

    Python 中一行代码搞定快排 Python 快速排序 Golang 快速排序

  • python实现快速排序

    受Haskell的快排启发 尝试了用python实现: 使用python实现更容易理解了(:зゝ∠)

网友评论

      本文标题:Python中的快排优化

      本文链接:https://www.haomeiwen.com/subject/dithlttx.html