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 相关文章推荐
vc6编写python扩展的方法分享
Jan 17 Python
python判断图片宽度和高度后删除图片的方法
May 22 Python
python结合API实现即时天气信息
Jan 19 Python
Python3爬虫学习之MySQL数据库存储爬取的信息详解
Dec 12 Python
pytorch 在sequential中使用view来reshape的例子
Aug 20 Python
python web框架 django wsgi原理解析
Aug 20 Python
python快速排序的实现及运行时间比较
Nov 22 Python
python数据预处理 :数据抽样解析
Feb 24 Python
python GUI库图形界面开发之PyQt5单选按钮控件QRadioButton详细使用方法与实例
Feb 28 Python
Python使用type动态创建类操作示例
Feb 29 Python
Python抓包程序mitmproxy安装和使用过程图解
Mar 02 Python
python实现将range()函数生成的数字存储在一个列表中
Apr 02 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+MYSQL会员系统的登陆即权限判断实现代码
2011/09/23 PHP
php中的比较运算符详解
2013/10/28 PHP
PHP用反撇号执行外部命令
2015/04/14 PHP
PHP内存溢出优化代码详解
2021/02/26 PHP
DIV始终居中的js代码
2014/02/17 Javascript
jQuery解析XML文件同时动态增加js文件的方法
2015/06/01 Javascript
详解JavaScript中void语句的使用
2015/06/04 Javascript
AngularJS基础 ng-click 指令示例代码
2016/08/01 Javascript
vue中渐进过渡效果实现
2016/10/27 Javascript
JS简单判断滚动条的滚动方向实现方法
2017/04/28 Javascript
JS鼠标滚动分页效果示例
2017/07/05 Javascript
javaScript日期工具类DateUtils详解
2017/12/08 Javascript
关于echarts在节点显示动态数据及添加提示文本所遇到的问题
2018/04/20 Javascript
vue中,在本地缓存中读写数据的方法
2018/09/21 Javascript
Vue+webpack实现懒加载过程解析
2020/02/17 Javascript
python使用urllib2实现发送带cookie的请求
2015/04/28 Python
浅谈Python 中整型对象的存储问题
2016/05/16 Python
Python黑帽编程 3.4 跨越VLAN详解
2016/09/28 Python
python非递归全排列实现方法
2017/04/10 Python
Python在不同目录下导入模块的实现方法
2017/10/27 Python
利用python爬取斗鱼app中照片方法实例
2017/12/03 Python
python 利用pandas将arff文件转csv文件的方法
2019/02/12 Python
Python批量生成幻影坦克图片实例代码
2019/06/04 Python
python gdal安装与简单使用
2019/08/01 Python
Django学习之文件上传与下载
2019/10/06 Python
从pandas一个单元格的字符串中提取字符串方式
2019/12/17 Python
python实现PolynomialFeatures多项式的方法
2021/01/06 Python
html5 canvas手势解锁源码分享
2020/01/07 HTML / CSS
Tirendo比利时:在线购买轮胎
2018/10/22 全球购物
美国宠物美容和宠物用品购物网站:Cherrybrook
2018/12/07 全球购物
linux面试题参考答案(8)
2015/08/11 面试题
大学第二课堂活动总结
2014/07/08 职场文书
2015年七一建党节演讲稿
2015/03/19 职场文书
劳动争议仲裁代理词
2015/05/25 职场文书
家庭贫困证明
2015/06/16 职场文书
详解redis在微服务领域的贡献
2021/10/16 Redis