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入门篇之正则表达式
Oct 20 Python
Python决策树和随机森林算法实例详解
Jan 30 Python
数据清洗--DataFrame中的空值处理方法
Jul 03 Python
对Python random模块打乱数组顺序的实例讲解
Nov 08 Python
在Pycharm中设置默认自动换行的方法
Jan 16 Python
Python django框架应用中实现获取访问者ip地址示例
May 17 Python
python正则表达式匹配不包含某几个字符的字符串方法
Jul 23 Python
Django Rest framework权限的详细用法
Jul 25 Python
django 快速启动数据库客户端程序的方法示例
Aug 16 Python
python3实现elasticsearch批量更新数据
Dec 03 Python
python给图像加上mask,并提取mask区域实例
Jan 19 Python
浅谈django框架集成swagger以及自定义参数问题
Jul 07 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 最大运行时间 max_execution_time修改方法
2010/03/08 PHP
PHP stristr() 函数(不区分大小写的字符串查找)
2010/06/03 PHP
php中flush()、ob_flush()、ob_end_flush()的区别介绍
2013/02/17 PHP
yii2使用GridView实现数据全选及批量删除按钮示例
2017/03/01 PHP
Centos7 Yum安装PHP7.2流程教程详解
2019/07/02 PHP
Laravel5.1 框架数据库操作DB运行原生SQL的方法分析
2020/01/07 PHP
Avengerls vs Newbee BO3 第三场2.18
2021/03/10 DOTA
node.js中的buffer.toString方法使用说明
2014/12/14 Javascript
JavaScript实现动画打开半透明提示层的方法
2015/04/21 Javascript
JavaScript基本语法讲解
2015/06/03 Javascript
easyui combobox开启搜索自动完成功能的实例代码
2016/11/08 Javascript
利用jquery实现实时更新歌词的方法
2017/01/06 Javascript
jquery事件与绑定事件
2017/03/16 Javascript
ionic3 懒加载
2017/08/16 Javascript
JS实现马赛克图片效果完整示例
2019/04/13 Javascript
React Hooks 实现和由来以及解决的问题详解
2020/01/17 Javascript
跟老齐学Python之Python安装
2014/09/12 Python
python使用paramiko实现远程拷贝文件的方法
2016/04/18 Python
python requests post多层字典的方法
2018/12/27 Python
tensorflow 查看梯度方式
2020/02/04 Python
详解Python中的分支和循环结构
2020/02/11 Python
通过实例解析Python return运行原理
2020/03/04 Python
Python接口测试数据库封装实现原理
2020/05/09 Python
Python使用Selenium模拟浏览器自动操作功能
2020/09/08 Python
通过一张图教会你CSS3倒影的实现
2017/09/26 HTML / CSS
基于HTML5 Canvas:字符串,路径,背景,图片的详解
2013/05/09 HTML / CSS
英国最大的百货公司:Harrods
2016/08/18 全球购物
会计毕业生自我鉴定
2013/11/04 职场文书
大学生毕业自我鉴定
2013/11/06 职场文书
小学生获奖感言范文
2014/02/02 职场文书
医学院毕业生自荐信范文
2014/03/06 职场文书
公司业务员岗位职责
2014/03/18 职场文书
毕业大学生自荐信
2014/06/17 职场文书
部门2015年度工作总结
2015/04/29 职场文书
教师节晚会主持词
2015/06/30 职场文书
Python数组变形的几种实现方法
2022/05/30 Python