热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python收入排序_python排序算法速度比较:快速排序,归并排序,冒泡排序

前言原理就不在这里说了,好多大神肯定比我这个初学者讲的好很多,推荐去B站看视频讲解,跟着手敲代码为什么选这三个排序呢?首先快排是必须掌握的看看快排在最坏的情况下(O(n)),且不使

前言

原理就不在这里说了,好多大神肯定比我这个初学者讲的好很多,推荐去B站看视频讲解,跟着手敲代码

为什么选这三个排序呢?

首先快排是必须掌握的

看看快排在最坏的情况下(O(n²)),且不使用辅助空间,与冒泡(O(n²))的比较

由于快排是不稳定的排序算法,且平均时间复杂度为O(nlogn),那找一个时间复杂度为O(nlogn)且稳定排序算法,那么就非归并排序莫属了.

一、快速排序,归并排序,冒泡排序比较

算法时间复杂度空间复杂度稳定性

平均最好最坏

冒泡排序O(n²)O(n)O(n²)O(1)稳定

快速排序O(nlogn)O(nlogn)O(n²)O(1)或O(n)不稳定

归并排序O(nlogn)O(nlogn)O(nlogn)O(n)稳定

二、源码

引入库,并生成1000个随机数,然后深拷贝若干份.

import random

from copy import deepcopy

arr0 = [random.randint(1, 100) for _ in range(1000)]

# arr0 = [_ for _ in range(1000, 0, -1)]

# print(arr0)

for i in range(1, 11):

exec(f'arr{i} = deepcopy(arr0)')

1.冒泡

def bubble_sort(arr):

for i in range(len(arr) - 1):

for j in range(len(arr) - 1 - i):

if arr[j] >= arr[j + 1]:

arr[j], arr[j + 1] = arr[j + 1], arr[j]

return arr

2.归并

def merge_sort(arr):

length = len(arr)

if length <= 1:

return arr

mid = length // 2

# 以下标mid为分界点,将arr的[:mid]给left,[mid:]给right

left = merge_sort(arr[:mid])

right = merge_sort(arr[mid:])

lp = 0

rp = 0

res = []

# 切记这里不是<=,因为数组的index一定是小于数组长度的

while lp

if left[lp] <= right[rp]:

res.append(left[lp])

lp += 1

else:

res.append(right[rp])

rp += 1

# 这里要用extend. left,right切片后的值为一个list

res.extend(left[lp:])

res.extend(right[rp:])

return res

3.快排

# 一句话快排

qs = lambda arr: arr if len(arr) <= 1 else qs([it for it in arr[1:] if it <= arr[0]]) + [arr[0]] + \

qs([it for it in arr[1:] if it > arr[0]])

# 空间复杂度O(1)的快排

def quick_sort_O1(arr, left, right):

if left >= right:

return

base = arr[left]

lp = left

rp = right

while lp

while lp = base:

rp -= 1

arr[lp] = arr[rp]

while lp

lp += 1

arr[rp] = arr[lp]

arr[lp] = base

quick_sort_O1(arr, left, lp - 1)

quick_sort_O1(arr, lp + 1, right)

return arr

# 空间复杂度O(n)的快排

def quick_sort_On(arr: list):

if len(arr) <= 1:

return arr

left = []

right = []

base = arr.pop(0)

for it in arr:

if it <= base:

left.append(it)

else:

right.append(it)

return quick_sort_On(left) + [base] + quick_sort_On(right)

# 空间复杂度O(n)的快排,引入随机处理,尝试规避快排的最坏风险

def quick_sort_On_random(arr: list):

if len(arr) <= 1:

return arr

left = []

right = []

base = arr.pop()

while arr:

tmp = arr.pop()

if tmp <= base:

left.append(tmp)

else:

right.append(tmp)

return quick_sort_On(left) + [base] + quick_sort_On(right)

三、创建长度为1000的list,在jupyter notebook上运行,观察结果

1.随机无序数组结果

a782474838417f82cb878a9963eb4181.png

空间换时间的做法明显让快排效率提高了一个数量级~

2.反序数组结果

将arr0重新赋值如下:

arr0 = [_ for _ in range(1000, 0, -1)]

1d286c1b3c64c4bcc8f0f969b9aa1e44.png

3.正序数组结果

将arr0重新赋值如下:

arr0 = [_ for _ in range(1000)]

9053eb3297eec1faebcae3b06bc57cd4.png

4.内置函数--遥遥领先

**内置函数那么快,学啥快排(捂脸)...

随机无序数组

4c44e65a8f944b49d44cf93c1a7e27a5.png

反序数组

ea06039f23c825de90bd5a154859ead1.png

正序结果

f33b43da4a8acd5a7fd0b8427c250c2f.png

总结

先不总结了,大致情况就如上吧.希望大家看完后给些意见和建议.

不知道有什么地方没考虑进去,本来只是为了规避快排最坏情况的风险而实现的quick_sort_On_random,意外发现每次都是最快的???

2020-12-16:

查找了相关资料,找到了quick_sort_On_random速度最快的原因,在这里记录一下

1.从列表的末尾(右端)弹出在CPython中需要恒定的时间,但是从左端弹出(.pop(0))需要的时间与列表的长度成正比

2.所有the_list [1:]中的元素在物理上向左移动一个位置.

3.如果需要经常删除索引位置0,那么使用collections.deque的实例要好得多. Deques支持从两端有效推送和弹出.



推荐阅读
  • 深入解析十大经典排序算法:动画演示、原理分析与代码实现
    本文深入探讨了十种经典的排序算法,不仅通过动画直观展示了每种算法的运行过程,还详细解析了其背后的原理与机制,并提供了相应的代码实现,帮助读者全面理解和掌握这些算法的核心要点。 ... [详细]
  • 深入学习 Python 中的 xlrd 模块:掌握 Excel 文件读取技巧
    本文深入探讨了 Python 中的 xlrd 模块,重点介绍了如何高效读取 Excel 文件(包括 xlsx 和 xls 格式)。同时,文章还详细讲解了 xlwt 模块在 Excel 文件写操作中的应用。此外,文中列举了常见单元格数据类型及其处理方法,为读者提供了全面的实践指导。 ... [详细]
  • 开发心得:利用 Redis 构建分布式系统的轻量级协调机制
    开发心得:利用 Redis 构建分布式系统的轻量级协调机制 ... [详细]
  • 如何判断一个度序列能否构成简单图——哈维尔-哈基米算法的应用与解析 ... [详细]
  • 在第1112课的作业解析中,我们回顾了第11章和第12章的核心知识点。第11章重点介绍了列表操作的相关函数,如 `remove()`、`del` 和 `pop()`,以及切片操作。例如,对于列表 `member = [1, 2, 3, 4, 5]`,可以通过 `member.remove(1)` 来移除列表中的元素1。此外,还详细解析了这些函数在实际编程中的应用和注意事项,帮助初学者更好地理解和掌握Python编程的基础知识。 ... [详细]
  • Python 并发编程进阶:从初学者到高手的进程与模块开发指南
    Python 并发编程进阶:从初学者到高手的进程与模块开发指南 ... [详细]
  • 深入解析Java中HashCode的功能与应用
    本文深入探讨了Java中HashCode的功能与应用。在Java中,HashCode主要用于提高哈希表(如HashMap、HashSet)的性能,通过快速定位对象存储位置,减少碰撞概率。文章详细解析了HashCode的生成机制及其在集合框架中的作用,帮助开发者更好地理解和优化代码。此外,还介绍了如何自定义HashCode方法以满足特定需求,并讨论了常见的实现误区和最佳实践。 ... [详细]
  • 在Python编程中,掌握高级技巧对于提升代码效率和可读性至关重要。本文重点探讨了生成器和迭代器的应用,这两种工具不仅能够优化内存使用,还能简化复杂数据处理流程。生成器通过按需生成数据,避免了大量数据加载对内存的占用,而迭代器则提供了一种优雅的方式来遍历集合对象。此外,文章还深入解析了这些高级特性的实际应用场景,帮助读者更好地理解和运用这些技术。 ... [详细]
  • voc生成xml 代码
    目录 lxmlwindows安装 读取示例 可视化 生成示例 上面是代码,下面有调用示例 api调用代码,其实只有几行:这个生成代码也很简 ... [详细]
  • Go语言中的高效排序与搜索算法解析
    在探讨Go语言中高效的排序与搜索算法时,本文深入分析了Go语言提供的内置排序功能及其优化策略。通过实例代码,详细讲解了如何利用Go语言的标准库实现快速、高效的排序和搜索操作,为开发者提供了实用的编程指导。 ... [详细]
  • Python正则表达式详解:掌握数量词用法轻松上手
    Python正则表达式详解:掌握数量词用法轻松上手 ... [详细]
  • 本文探讨了如何利用Python的反射机制,高效地将Excel中的数据映射并转换为类对象属性。通过反射技术,可以动态地读取Excel文件中的数据,并将其加载到内存中,转换为相应的类对象,从而方便进行后续的数据处理和操作。该方法适用于需要频繁从Excel导入数据的场景,能够显著提高开发效率和代码可维护性。 ... [详细]
  • 在第七天的深度学习课程中,我们将重点探讨DGL框架的高级应用,特别是在官方文档指导下进行数据集的下载与预处理。通过详细的步骤说明和实用技巧,帮助读者高效地构建和优化图神经网络的数据管道。此外,我们还将介绍如何利用DGL提供的模块化工具,实现数据的快速加载和预处理,以提升模型训练的效率和准确性。 ... [详细]
  • 最大化两个非空子集之间的和的差异:集合划分策略分析 ... [详细]
  • 基于PythonOCC库,本文探讨了如何实现对曲线边(TopoDS_Edge)进行等间距周长分割的分析方法及其应用。通过使用BRepGProp模块中的线性属性计算功能,我们能够精确地将曲线分割成多个等长段,从而为后续的几何建模和工程应用提供基础支持。该方法不仅提高了曲线处理的效率,还增强了模型的准确性和可靠性。 ... [详细]
author-avatar
yzxnha_975
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有