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 相关文章推荐
python3.3实现乘法表示例
Feb 07 Python
python通过floor函数舍弃小数位的方法
Mar 17 Python
Python、PyCharm安装及使用方法(Mac版)详解
Apr 28 Python
Python实现常见的回文字符串算法
Nov 14 Python
python 产生token及token验证的方法
Dec 26 Python
对python字典过滤条件的实例详解
Jan 22 Python
python卸载后再次安装遇到的问题解决
Jul 10 Python
Python jieba库用法及实例解析
Nov 04 Python
Python常用模块logging——日志输出功能(示例代码)
Nov 20 Python
Tensorflow的梯度异步更新示例
Jan 23 Python
Python命名空间namespace及作用域原理解析
Jun 05 Python
使用python将微信image下.dat文件解密为.png的方法
Nov 30 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函数spl_autoload_register()用法和__autoload()介绍
2012/02/04 PHP
关于访问控制的一首PHP面试题(对属性或方法的访问控制)
2012/09/13 PHP
PHP计数器的实现代码
2013/06/08 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
浅谈laravel 5.6 安装 windows上使用composer的安装过程
2019/10/18 PHP
php+iframe 实现上传文件功能示例
2020/03/04 PHP
用一段js程序来实现动画功能
2007/03/06 Javascript
javascript学习笔记(九) js对象 设计模式
2012/06/19 Javascript
JS多物体 任意值 链式 缓冲运动
2012/08/10 Javascript
setTimeout函数兼容各主流浏览器运行执行效果实例
2013/06/13 Javascript
利用javaScript实现点击输入框弹出窗体选择信息
2013/12/11 Javascript
Bootstrap每天必学之前端开发框架
2015/11/19 Javascript
jQuery实现简单的文件上传进度条效果
2020/03/26 Javascript
Bootstrap DateTime Picker日历控件简单应用
2017/03/25 Javascript
react路由配置方式详解
2017/08/07 Javascript
基于Vue 2.0 监听文本框内容变化及ref的使用说明介绍
2018/08/24 Javascript
对vue中methods互相调用的方法详解
2018/08/30 Javascript
浅谈一个webpack构建速度优化误区
2019/06/24 Javascript
在Python的web框架中编写创建日志的程序的教程
2015/04/30 Python
利用python实现简单的循环购物车功能示例代码
2017/07/05 Python
python opencv实现任意角度的透视变换实例代码
2018/01/12 Python
python模糊图片过滤的方法
2018/12/14 Python
Python2和Python3的共存和切换使用
2019/04/12 Python
Jupyter notebook命令和编辑模式常用快捷键汇总
2020/11/17 Python
html5 css3 动态气泡按钮实例演示
2012/12/02 HTML / CSS
英国最红的高街时尚品牌:Topshop
2016/08/05 全球购物
澳大利亚墨尔本的在线时装店:LORETA
2018/09/14 全球购物
学生处主任岗位职责
2013/12/01 职场文书
小学新教师培训方案
2014/02/03 职场文书
关于是否需要写商业计划书
2014/02/07 职场文书
畜牧兽医本科生的自我评价
2014/03/03 职场文书
派出所正风肃纪剖析材料
2014/10/10 职场文书
习总书记三严三实学习心得体会
2014/10/13 职场文书
Django项目如何正确配置日志(logging)
2021/04/29 Python
springboot临时文件存储目录配置方式
2021/07/01 Java/Android
JS前端使用canvas实现扩展物体类和事件派发
2022/08/05 Javascript