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中的元类(metaclass)
Feb 14 Python
Python开发虚拟环境使用virtualenvwrapper的搭建步骤教程图解
Sep 19 Python
Python解析Excle文件中的数据方法
Oct 23 Python
Python3.0 实现决策树算法的流程
Aug 08 Python
自适应线性神经网络Adaline的python实现详解
Sep 30 Python
Python实现手机号自动判断男女性别(实例解析)
Dec 22 Python
pytorch获取模型某一层参数名及参数值方式
Dec 30 Python
Python模拟登入的N种方式(建议收藏)
May 31 Python
Python爬虫代理池搭建的方法步骤
Sep 28 Python
python 实现socket服务端并发的四种方式
Dec 14 Python
安装pytorch时报sslerror错误的解决方案
May 17 Python
Django drf请求模块源码解析
Jun 08 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 使用post,get的一种简洁方式
2010/04/25 PHP
php ob_flush,flush在ie中缓冲无效的解决方法
2010/05/09 PHP
支持中文、字母、数字的PHP验证码
2015/05/04 PHP
php实现对象克隆的方法
2015/06/20 PHP
浅谈htmlentities 、htmlspecialchars、addslashes的使用方法
2016/12/09 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
快速保存网页中所有图片的方法
2006/06/23 Javascript
jQuery ctrl+Enter shift+Enter实现代码
2010/02/07 Javascript
P3P Header解决Cookie跨域的问题
2013/03/12 Javascript
给文字加上着重号的JS代码
2013/11/12 Javascript
jQuery 2.0.3 源码分析之core(一)整体架构
2014/05/27 Javascript
jQuery+CSS3折叠卡片式下拉列表框实现效果
2015/11/02 Javascript
使用struts2+Ajax+jquery验证用户名是否已被注册
2016/03/22 Javascript
JavaScript实现垂直滚动条效果
2017/01/18 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
2017/01/19 Javascript
node.js使用express框架进行文件上传详解
2019/03/03 Javascript
浅析微信小程序modal弹窗关闭默认会执行cancel问题
2019/10/14 Javascript
Map与WeakMap类型在JavaScript中的使用详解
2020/11/18 Javascript
[03:20]2015国际邀请赛全明星表演赛
2015/08/08 DOTA
Python实现基于权重的随机数2种方法
2015/04/28 Python
python 遍历目录(包括子目录)下所有文件的实例
2018/07/11 Python
python实现停车管理系统
2018/11/30 Python
python实现三维拟合的方法
2018/12/29 Python
Python使用贪婪算法解决问题
2019/10/22 Python
使用Tensorboard工具查看Loss损失率
2020/02/15 Python
keras实现多GPU或指定GPU的使用介绍
2020/06/17 Python
HTML5对手机页面长按会粘贴复制禁用的解决方法
2016/07/19 HTML / CSS
手机端用rem+scss做适配的详解
2017/11/15 HTML / CSS
中专药剂专业应届毕的自我评价
2013/12/27 职场文书
幼儿园消防安全制度
2014/01/26 职场文书
意外死亡赔偿协议书
2014/10/14 职场文书
公司食堂管理制度
2015/08/05 职场文书
朋友聚会祝酒词
2015/08/10 职场文书
MySQL系列之三 基础篇
2021/07/02 MySQL
Python如何用re模块实现简易tokenizer
2022/05/02 Python