python八大排序算法速度实例对比


Posted in Python onDecember 06, 2017

这篇文章并不是介绍排序算法原理的,纯粹是想比较一下各种排序算法在真实场景下的运行速度。

算法由 Python 实现,可能会和其他语言有些区别,仅当参考就好。

测试的数据是自动生成的,以数组形式保存到文件中,保证数据源的一致性。

排序算法

python八大排序算法速度实例对比

直接插入排序

时间复杂度:O(n²)
空间复杂度:O(1)
稳定性:稳定

def insert_sort(array):
  for i in range(len(array)):
    for j in range(i):
      if array[i] < array[j]:
        array.insert(j, array.pop(i))
        break
  return array

希尔排序

时间复杂度:O(n)
空间复杂度:O(n√n)
稳定性:不稳定

def shell_sort(array):
  gap = len(array)
  while gap > 1:
    gap = gap // 2
    for i in range(gap, len(array)):
      for j in range(i % gap, i, gap):
        if array[i] < array[j]:
          array[i], array[j] = array[j], array[i]
  return array

简单选择排序

时间复杂度:O(n²)
空间复杂度:O(1)
稳定性:不稳定

def select_sort(array):
  for i in range(len(array)):
    x = i # min index
    for j in range(i, len(array)):
      if array[j] < array[x]:
        x = j
    array[i], array[x] = array[x], array[i]
  return array

堆排序

时间复杂度:O(nlog₂n)
空间复杂度:O(1)
稳定性:不稳定

def heap_sort(array):
  def heap_adjust(parent):
    child = 2 * parent + 1 # left child
    while child < len(heap):
      if child + 1 < len(heap):
        if heap[child + 1] > heap[child]:
          child += 1 # right child
      if heap[parent] >= heap[child]:
        break
      heap[parent], heap[child] = \
        heap[child], heap[parent]
      parent, child = child, 2 * child + 1

  heap, array = array.copy(), []
  for i in range(len(heap) // 2, -1, -1):
    heap_adjust(i)
  while len(heap) != 0:
    heap[0], heap[-1] = heap[-1], heap[0]
    array.insert(0, heap.pop())
    heap_adjust(0)
  return array

冒泡排序

时间复杂度:O(n²)
空间复杂度:O(1)
稳定性:稳定

def bubble_sort(array):
  for i in range(len(array)):
    for j in range(i, len(array)):
      if array[i] > array[j]:
        array[i], array[j] = array[j], array[i]
  return array

快速排序

时间复杂度:O(nlog₂n)
空间复杂度:O(nlog₂n)
稳定性:不稳定

def quick_sort(array):
  def recursive(begin, end):
    if begin > end:
      return
    l, r = begin, end
    pivot = array[l]
    while l < r:
      while l < r and array[r] > pivot:
        r -= 1
      while l < r and array[l] <= pivot:
        l += 1
      array[l], array[r] = array[r], array[l]
    array[l], array[begin] = pivot, array[l]
    recursive(begin, l - 1)
    recursive(r + 1, end)

  recursive(0, len(array) - 1)
  return array

归并排序

时间复杂度:O(nlog₂n)
空间复杂度:O(1)
稳定性:稳定

def merge_sort(array):
  def merge_arr(arr_l, arr_r):
    array = []
    while len(arr_l) and len(arr_r):
      if arr_l[0] <= arr_r[0]:
        array.append(arr_l.pop(0))
      elif arr_l[0] > arr_r[0]:
        array.append(arr_r.pop(0))
    if len(arr_l) != 0:
      array += arr_l
    elif len(arr_r) != 0:
      array += arr_r
    return array

  def recursive(array):
    if len(array) == 1:
      return array
    mid = len(array) // 2
    arr_l = recursive(array[:mid])
    arr_r = recursive(array[mid:])
    return merge_arr(arr_l, arr_r)

  return recursive(array)

基数排序

时间复杂度:O(d(r+n))
空间复杂度:O(rd+n)
稳定性:稳定

def radix_sort(array):
  bucket, digit = [[]], 0
  while len(bucket[0]) != len(array):
    bucket = [[], [], [], [], [], [], [], [], [], []]
    for i in range(len(array)):
      num = (array[i] // 10 ** digit) % 10
      bucket[num].append(array[i])
    array.clear()
    for i in range(len(bucket)):
      array += bucket[i]
    digit += 1
  return array

速度比较

from random import random
from json import dumps, loads
# 生成随机数文件
def dump_random_array(file='numbers.json', size=10 ** 4):
  fo = open(file, 'w', 1024)
  numlst = list()
  for i in range(size):
    numlst.append(int(random() * 10 ** 10))
  fo.write(dumps(numlst))
  fo.close()
# 加载随机数列表
def load_random_array(file='numbers.json'):
  fo = open(file, 'r', 1024)
  try:
    numlst = fo.read()
  finally:
    fo.close()
  return loads(numlst)
from _datetime import datetime
# 显示函数执行时间
def exectime(func):
  def inner(*args, **kwargs):
    begin = datetime.now()
    result = func(*args, **kwargs)
    end = datetime.now()
    inter = end - begin
    print('E-time:{0}.{1}'.format(
      inter.seconds,
      inter.microseconds
    ))
    return result
  return inner

如果数据量特别大,采用分治算法的快速排序和归并排序,可能会出现递归层次超出限制的错误。

解决办法:导入 sys 模块(import sys),设置最大递归次数(sys.setrecursionlimit(10 ** 8))。

@exectime
def bubble_sort(array):
  for i in range(len(array)):
    for j in range(i, len(array)):
      if array[i] > array[j]:
        array[i], array[j] = array[j], array[i]
  return array
array = load_random_array()
print(bubble_sort(array) == sorted(array))

↑ 示例:测试直接插入排序算法的运行时间,@exectime 为执行时间装饰器。

算法执行时间

python八大排序算法速度实例对比

算法速度比较

python八大排序算法速度实例对比

python八大排序算法速度实例对比

总结

以上就是本文关于Python八大排序算法速度实例对比的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
python调用shell的方法
Nov 20 Python
python实现在sqlite动态创建表的方法
May 08 Python
Python实现给qq邮箱发送邮件的方法
May 28 Python
Python实现拷贝多个文件到同一目录的方法
Sep 19 Python
Python实现SSH远程登陆,并执行命令的方法(分享)
May 08 Python
Python 查看文件的编码格式方法
Dec 21 Python
替换python字典中的key值方法
Jul 06 Python
对python 读取线的shp文件实例详解
Dec 22 Python
python2和python3在处理字符串上的区别详解
May 29 Python
对numpy下的轴交换transpose和swapaxes的示例解读
Jun 26 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
Oct 18 Python
python调用win32接口进行截图的示例
Nov 11 Python
Python语言实现将图片转化为html页面
Dec 06 #Python
Python实现比较扑克牌大小程序代码示例
Dec 06 #Python
Python3简单实例计算同花的概率代码
Dec 06 #Python
Python基于回溯法解决01背包问题实例
Dec 06 #Python
Python基于动态规划算法解决01背包问题实例
Dec 06 #Python
Python机器学习之决策树算法实例详解
Dec 06 #Python
快速入门python学习笔记
Dec 06 #Python
You might like
PHP中的加密功能
2006/10/09 PHP
用PHP实现的生成静态HTML速度快类库
2007/03/31 PHP
php GeoIP的使用教程
2011/03/09 PHP
php addslashes 利用递归实现使用反斜线引用字符串
2013/08/05 PHP
PHP文件读写操作相关函数总结
2014/11/18 PHP
PHP扩展开发教程(总结)
2015/11/04 PHP
laravel-admin select框默认选中的方法
2019/10/03 PHP
js一组验证函数
2008/12/20 Javascript
解析jquery获取父窗口的元素
2013/06/26 Javascript
jQuery中children()方法用法实例
2015/01/07 Javascript
JS获取图片lowsrc属性的方法
2015/04/01 Javascript
JS实现图片的不间断连续滚动的简单实例
2016/06/03 Javascript
jQuery插件开发发送短信倒计时功能代码
2017/05/09 jQuery
JS仿QQ好友列表展开、收缩功能(第一篇)
2017/07/07 Javascript
three.js中3D视野的缩放实现代码
2017/11/16 Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
2020/03/08 Javascript
浅谈Vue3 Composition API如何替换Vue Mixins
2020/04/29 Javascript
Javascript生成器(Generator)的介绍与使用
2021/01/31 Javascript
Python读取ini文件、操作mysql、发送邮件实例
2015/01/01 Python
Python自定义函数实现求两个数最大公约数、最小公倍数示例
2018/05/21 Python
Django框架使用富文本编辑器Uedit的方法分析
2018/07/31 Python
Python装饰器简单用法实例小结
2018/12/03 Python
浅析Python requests 模块
2020/10/09 Python
python使用Windows的wmic命令监控文件运行状况,如有异常发送邮件报警
2021/01/30 Python
css3实现垂直下拉动画菜单示例
2014/04/22 HTML / CSS
英国珠宝钟表和家居礼品精品店:David Shuttle
2018/02/24 全球购物
迪士尼英国官方商店:shopDisney UK
2019/09/21 全球购物
关于.NET, HTML的五个问题
2012/08/29 面试题
外语专业毕业生自荐信
2014/04/14 职场文书
服务承诺书范文
2014/05/19 职场文书
护理学专业求职信
2014/06/29 职场文书
小学教师师德师风演讲稿
2014/08/22 职场文书
2014党支部对照检查材料思想汇报
2014/10/05 职场文书
反邪教教育心得体会
2016/01/15 职场文书
使用Oracle跟踪文件的问题详解
2021/06/28 Oracle
Spring事务管理下synchronized锁失效问题的解决方法
2022/03/31 Java/Android