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实现strcmp函数功能示例
Mar 25 Python
Python使用BeautifulSoup库解析HTML基本使用教程
Mar 31 Python
Python 制作糗事百科爬虫实例
Sep 22 Python
Python信息抽取之乱码解决办法
Jun 29 Python
Django实现快速分页的方法实例
Oct 22 Python
Python中协程用法代码详解
Feb 10 Python
对pandas数据判断是否为NaN值的方法详解
Nov 06 Python
python利用Opencv实现人脸识别功能
Apr 25 Python
Python学习笔记基本数据结构之序列类型list tuple range用法分析
Jun 08 Python
Python使用scipy模块实现一维卷积运算示例
Sep 05 Python
python 解决flask 图片在线浏览或者直接下载的问题
Jan 09 Python
python 爬取百度文库并下载(免费文章限定)
Dec 04 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得到某段时间区间的时间戳 php定时任务
2012/04/12 PHP
PHP检测移动设备类mobile detection使用实例
2014/04/14 PHP
Yii2主题(Theme)用法详解
2016/07/23 PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
2018/05/28 PHP
Jquery 高亮显示文本中重要的关键字
2009/12/24 Javascript
Jquery乱码的一次解决过程 图解教程
2010/02/20 Javascript
网站页面自动跳转实现方法PHP、JSP(下)
2010/08/01 Javascript
Javascript 闭包引起的IE内存泄露分析
2012/05/23 Javascript
js中split函数的使用方法说明
2013/12/26 Javascript
温习Javascript基础语法之词法结构
2016/05/31 Javascript
JQuery查找子元素find()和遍历集合each的方法总结
2017/03/07 Javascript
JavaScript运动框架 解决速度正负取整问题(一)
2017/05/17 Javascript
VUE axios发送跨域请求需要注意的问题
2017/07/06 Javascript
jQuery实现炫丽的3d旋转星空效果
2018/07/04 jQuery
React中嵌套组件与被嵌套组件的通信过程
2018/07/11 Javascript
详解如何使用router-link对象方式传递参数?
2019/05/02 Javascript
layUI实现三级导航菜单效果
2019/07/26 Javascript
[01:25]DOTA2自定义游戏灵园鬼域等你踏足
2015/10/30 DOTA
Python实现遍历数据库并获取key的值
2015/05/17 Python
Python基于回溯法子集树模板解决m着色问题示例
2017/09/07 Python
OPENCV去除小连通区域,去除孔洞的实例讲解
2018/06/21 Python
Python实现繁体中文与简体中文相互转换的方法示例
2018/12/18 Python
python制作简单五子棋游戏
2019/06/18 Python
浅谈django框架集成swagger以及自定义参数问题
2020/07/07 Python
The Hut英国:英国领先的豪华在线百货商店
2019/07/26 全球购物
Nobody Denim官网:购买高级女士牛仔裤
2021/03/15 全球购物
团队精神演讲稿
2013/12/31 职场文书
临床护士自荐信
2014/01/31 职场文书
土地转让协议书
2014/04/15 职场文书
市政工程技术专业自荐书
2014/07/06 职场文书
2014年预备党员群众路线教育实践活动对照检查材料思想汇报
2014/10/02 职场文书
办公室禁烟通知
2015/04/23 职场文书
大学运动会加油稿
2015/07/22 职场文书
校长新学期致辞
2015/07/30 职场文书
朋友圈早安励志语录!
2019/07/08 职场文书
CSS 鼠标点击拖拽效果的实现代码
2022/12/24 HTML / CSS