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分割TXT文件成4K的TXT文件
May 23 Python
一个检测OpenSSL心脏出血漏洞的Python脚本分享
Apr 10 Python
Python中replace方法实例分析
Aug 20 Python
win7上python2.7连接mysql数据库的方法
Jan 14 Python
回调函数的意义以及python实现实例
Jun 20 Python
Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例
Jun 09 Python
Python3数字求和的实例
Feb 19 Python
Pyqt QImage 与 np array 转换方法
Jun 27 Python
python版百度语音识别功能
Jul 09 Python
浅谈PyTorch的可重复性问题(如何使实验结果可复现)
Feb 20 Python
Python 多线程C段扫描、检测 Ping扫描脚本的实现
Sep 03 Python
Python初学者必备的文件读写指南
Jun 23 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执行时间问题
2011/07/17 PHP
浅析PHP中strlen和mb_strlen的区别
2014/08/31 PHP
php中count获取多维数组长度的方法
2014/11/03 PHP
使用纯php代码实现页面伪静态的方法
2015/07/25 PHP
PHP实现的猴王算法(猴子选大王)示例
2018/04/30 PHP
PHP下载大文件失败并限制下载速度的实例代码
2019/05/10 PHP
javascript基于jQuery的表格悬停变色/恢复,表格点击变色/恢复,点击行选Checkbox
2008/08/05 Javascript
javascript 短路法代码精简
2009/08/20 Javascript
js loading加载效果实现代码
2009/11/24 Javascript
JavaScript 拾漏补遗
2009/12/27 Javascript
逐一介绍Jquery data()、Jquery stop()、jquery delay()函数(详)
2015/11/04 Javascript
js 定义对象数组(结合)多维数组方法
2016/07/27 Javascript
Bootstrap作品展示站点实战项目2
2016/10/14 Javascript
从零学习node.js之详解异步控制工具async(八)
2017/02/27 Javascript
JavaScript通过filereader接口读取文件
2017/05/10 Javascript
vue-cli和v-charts实现可视化图表过程解析
2019/10/08 Javascript
微信小程序实用代码段(收藏版)
2019/12/17 Javascript
小程序Scroll-view上拉滚动刷新数据
2020/06/21 Javascript
[12:29]2018国际邀请赛 开幕秀
2018/08/22 DOTA
Python实时获取cmd的输出
2015/12/13 Python
Python实现遍历目录的方法【测试可用】
2017/03/22 Python
python3+PyQt5实现文档打印功能
2018/04/24 Python
python队列queue模块详解
2018/04/27 Python
python执行CMD指令,并获取返回的方法
2018/12/19 Python
python正则表达式的懒惰匹配和贪婪匹配说明
2020/07/13 Python
美国流行背包品牌:JanSport(杰斯伯)
2018/03/02 全球购物
伊莱克斯(Electrolux)俄罗斯网上商店:瑞典家用电器品牌
2021/01/23 全球购物
暑期实习鉴定
2013/12/16 职场文书
《秋姑娘的信》教学反思
2014/02/28 职场文书
2014年学雷锋活动总结
2014/06/26 职场文书
高一军训的心得体会
2014/09/01 职场文书
党员干部反四风民主生活会对照检查材料思想汇报
2014/10/12 职场文书
经费申请报告范文
2015/05/18 职场文书
公务员廉洁从政心得体会
2016/01/19 职场文书
你会写报告?产品体验报告到底该怎么写?
2019/08/14 职场文书
浅谈spring boot使用thymeleaf版本的问题
2021/08/04 Java/Android