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 map函数及Python map()函数的用法
Nov 16 Python
Python遍历numpy数组的实例
Apr 04 Python
PYTHON基础-时间日期处理小结
May 05 Python
点球小游戏python脚本
May 22 Python
python对矩阵进行转置的2种处理方法
Jul 17 Python
softmax及python实现过程解析
Sep 30 Python
python多进程(加入进程池)操作常见案例
Oct 21 Python
python socket通信编程实现文件上传代码实例
Dec 14 Python
Python+OpenCV实现旋转文本校正方式
Jan 09 Python
Django中的模型类设计及展示示例详解
May 29 Python
python属于解释型语言么
Jun 15 Python
python使用pygame创建精灵Sprite
Apr 06 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
Amazon Prime Video平台《无限住人 -IMMORTAL-》2020年开始TV放送!
2020/03/06 日漫
用php+mysql一个名片库程序
2006/10/09 PHP
PHP运行模式的深入理解
2013/06/03 PHP
分享一段PHP制作的中文拼音首字母工具类
2014/12/11 PHP
WordPress中用于创建以及获取侧边栏的PHP函数讲解
2015/12/29 PHP
PHP中Socket连接及读写数据超时问题分析
2016/07/19 PHP
PHP获取文本框、密码域、按钮的值实例代码
2017/04/19 PHP
使用javascript获取flash加载的百分比的实现代码
2011/05/25 Javascript
javascript中的注释使用与注意事项小结
2011/09/20 Javascript
JS将所有对象s的属性复制给对象r(原生js+jquery)
2014/01/25 Javascript
jQuery实现网站添加高亮突出显示效果的方法
2015/06/26 Javascript
JavaScript+CSS实现仿天猫侧边网页菜单效果
2015/08/25 Javascript
Bootstrap学习笔记之css组件(3)
2016/06/07 Javascript
js编写三级联动简单案例
2016/12/21 Javascript
jquery+ajax实现省市区三级联动 (封装和不封装两种方式)
2017/05/15 jQuery
Vue使用vue-cli创建项目
2017/09/01 Javascript
React+Antd+Redux实现待办事件的方法
2019/03/14 Javascript
JS实现的排列组合算法示例
2019/07/16 Javascript
VUE 实现动态给对象增加属性,并触发视图更新操作示例
2019/11/29 Javascript
vue如何使用async、await实现同步请求
2019/12/09 Javascript
webpack 动态批量加载文件的实现方法
2020/03/19 Javascript
js通过canvas生成图片缩略图
2020/10/02 Javascript
NodeJS模块Buffer原理及使用方法解析
2020/11/11 NodeJs
用Python和MD5实现网站挂马检测程序
2014/03/13 Python
使用FastCGI部署Python的Django应用的教程
2015/07/22 Python
python使用锁访问共享变量实例解析
2018/02/08 Python
浅谈Python中重载isinstance继承关系的问题
2018/05/04 Python
详解Django3中直接添加Websockets方式
2020/02/12 Python
CSS3用@font-face实现自定义英文字体
2013/09/23 HTML / CSS
大学毕业的自我鉴定
2013/10/08 职场文书
财务会计专业推荐信
2013/11/30 职场文书
基督教婚礼主持词
2014/03/14 职场文书
党的群众路线教育实践活动动员会主持词
2014/03/20 职场文书
大学新闻系求职信
2014/06/03 职场文书
2014教师年度工作总结
2014/11/10 职场文书
Python采集壁纸并实现炫轮播
2022/04/30 Python