这篇文章并不是介绍排序算法原理的,纯粹是想比较一下各种排序算法在真实场景下的运行速度。

算法由 Python 实现,用到了一些语法糖,可能会和其他语言有些区别,仅当参考就好。

测试的数据是自动生成的,以数组形式保存到文件中,保证数据源的一致性。

排序算法

image

直接插入排序

时间复杂度: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

速度比较

image

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)

image

显示执行时间

如果数据量特别大,采用分治算法的快速排序和归并排序,可能会出现递归层次超出限制的错误。

解决办法:导入 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 为执行时间装饰器。

算法执行时间

image

算法速度比较

image

image

python八大排序算法 间书_Python 八大排序算法速度比较相关推荐

  1. python八大排序算法 间书_python八大排序算法

    print("冒泡排序") def bubbleSort(input_list):'''函数说明:冒泡排序(升序) :param input_lis: 待排序列表 :return: ...

  2. python的算法是指_python中的算法

    算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制.也就是说,能够对一定规范的输入,在有限时间内获得所要求的输 ...

  3. python常用算法有哪些_python常见排序算法基础教程

    前言:前两天腾讯笔试受到1万点暴击,感觉浪费我两天时间去牛客网做题--这篇博客介绍几种简单/常见的排序算法,算是整理下. 时间复杂度 (1)时间频度一个算法执行所耗费的时间,从理论上是不能算出来的,必 ...

  4. python与c进程间通讯_python 与c通信

    Python多进程并行编程实践-mpi4py的使用 前言 在高性能计算的项目中我们通常都会使用效率更高的编译型的语言例如C.C++.Fortran等,但是由于Python的灵活性和易用性使得它在发展和 ...

  5. python基础知识笔记简书_Python基础学习笔记

    Python貌似有点火热,上手还是比较简单的,自己找了个教程也偷偷的学习一下,扒了一下网上的图片和数据,感觉并不是很难呀(不过之前换电脑,代码丢了,有点可惜,不过网上教程一抓一大把,随便看看也能扒一些 ...

  6. python对excel操作简书_Python实现EXCEL常用操作——pandas简介

    知乎的代码块太丑了,这里的内容就更新到简书了Python实现EXCEL常用操作--pandas简介​www.jianshu.com EXCEL是日常办公最常用的软件,然而遇到数据量特别大(超过10W条 ...

  7. python开发人员看什么书_python初学者看什么书

    虽然我不是Python高手,但我是零基础,之前会的都是软件PS,PPT之类.点击链接加入群[我爱python大神]:https://jq.qq.com/?_wv=1027&k=47zuLPd ...

  8. python牛顿迭代法求根例题_python求根算法

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! scipy官网:https:www.scipy.org这个库是python科学计 ...

  9. python基础知识笔记简书_Python学习笔记01——基础知识

    Python常用数据类型: 整数(int),浮点数(float),字符串(str) 布尔型(True,False),空值(None) 列表(list):一种有序集合,可以随时添加删除其中的元素. cl ...

最新文章

  1. Angularjs集成第三方js插件之Uploadify
  2. 开源数据库技术分享及未来展望|CIC 真·全明星阵容
  3. 湖南大学新生赛C,G,J题解
  4. 什么是SLA?SLA管理包括哪些内容?
  5. assign深拷贝_前端深拷贝和浅拷贝
  6. $sanitize和$sce服务的使用方法
  7. if转java_java 使用if将String内字符转换 递归
  8. python整数加法计算器_Python应用实例赏析2.1简单计算
  9. 简要分析光端机选购必备条件
  10. 教你一招:让集群慢节点无处可藏
  11. 董明珠“不让加班了”!格力官宣:实行双休,取消加班
  12. PyTorch系列入门到精通——生成对抗网络一瞥
  13. go interface 转 string_深入理解Go的interface内部执行原理
  14. WINDOWS 下 MYSQLQ全库数据倒出和执行计划加入
  15. Failed to load class org.slf4j.impl.StaticLoggerBinder
  16. ubuntu16.04便捷使用(常用工具、常用快捷键、常用使用教程)
  17. 孤独是人成熟的必经之路
  18. 使用ESP32 + HaaS Python打造运动心率检测系统 云上实时守护运动健康
  19. Java api文档自动生成工具smartdoc+torna
  20. SpringBoot集成swagger3(powernode CD2207)(内含教学视频+源代码)

热门文章

  1. Python爬虫知识点四--scrapy框架
  2. 开启Ubuntu root 远程登录
  3. 最新Android ADT, SDK, SDK_tool等官方下载说明(及时更新)
  4. POJ 1573机器人走迷宫
  5. 无废话ExtJs 入门教程八[脚本调试Firefox:firebug]
  6. Javascript 键盘事件
  7. 2021大同高考成绩查询,大同高考分数查询(查询方法+入口)
  8. Git删除本地/本地远程/远程服务器分支
  9. Android7.1开机启动脚本
  10. app_process执行java文件