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类继承用法实例分析
May 27 Python
python字典的常用操作方法小结
May 16 Python
python3使用pyqt5制作一个超简单浏览器的实例
Oct 19 Python
Python编程实现双链表,栈,队列及二叉树的方法示例
Nov 01 Python
Django框架多表查询实例分析
Jul 04 Python
Flask web开发处理POST请求实现(登录案例)
Jul 26 Python
Python实现模拟浏览器请求及会话保持操作示例
Jul 30 Python
Python增强赋值和共享引用注意事项小结
May 28 Python
Django中密码的加密、验密、解密操作
Dec 19 Python
python 调用js的四种方式
Apr 11 Python
用Python提取PDF表格的方法
Apr 11 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
在线短消息收发的程序,不用数据库
2006/10/09 PHP
《PHP边学边教》(02.Apache+PHP环境配置――上篇)
2006/12/13 PHP
PHP5.3连接Oracle客户端及PDO_OCI模块的安装方法
2016/05/13 PHP
php微信公众号开发之秒杀
2018/10/20 PHP
Linux基于php-fpm模式的lamp搭建phpmyadmin的方法
2018/10/25 PHP
Laravel框架基于ajax实现二级联动功能示例
2019/01/17 PHP
Javascript Math对象
2009/08/13 Javascript
JavaScript 获取用户客户端操作系统版本
2009/08/25 Javascript
Mootools 1.2教程 滚动条(Slider)
2009/09/15 Javascript
function foo的原型与prototype属性解惑
2010/11/19 Javascript
JavaScript利用正则表达式去除日期中的-
2014/06/09 Javascript
javascript框架设计之框架分类及主要功能
2015/06/23 Javascript
简洁实用的BootStrap jQuery手风琴插件
2016/08/31 Javascript
fullCalendar中文API官方文档
2017/02/07 Javascript
原生js+cookie实现购物车功能的方法分析
2017/12/21 Javascript
vue 下列表侧滑操作实例代码详解
2018/07/24 Javascript
Angular 2使用路由自定义弹出组件toast操作示例
2019/05/10 Javascript
微信小程序中为什么使用var that=this
2019/08/27 Javascript
vue实现将数据存入vuex中以及从vuex中取出数据
2019/11/08 Javascript
vue-socket.io跨域问题有效解决方法
2020/02/11 Javascript
用Python实现KNN分类算法
2017/12/22 Python
python实现拓扑排序的基本教程
2018/03/11 Python
python爬虫获取小区经纬度以及结构化地址
2018/12/30 Python
Python理解递归的方法总结
2019/01/28 Python
python中的反斜杠问题深入讲解
2019/08/12 Python
Numpy一维线性插值函数的用法
2020/04/22 Python
Django数据模型中on_delete使用详解
2020/11/30 Python
CSS3混合模式mix-blend-mode/background-blend-mode简介
2018/03/15 HTML / CSS
香港时装购物网站:ZALORA香港
2017/04/23 全球购物
Styleonme中文网:韩国高档人气品牌
2017/06/21 全球购物
KELLER SPORTS荷兰:在线订购最好的运动产品
2020/10/13 全球购物
如何整合JQuery和Prototype
2014/01/31 面试题
2014两会学习心得:时代的发展
2014/03/17 职场文书
2015年八一建军节慰问信
2015/03/23 职场文书
描写九月优美句子(39条)
2019/09/11 职场文书
Python使用海龟绘图实现贪吃蛇游戏
2021/06/18 Python