python 八大排序的优缺点

Python external sort外排序算法详解及源码 外排序算法的基本思想是将大规模数据分割成能够在内存中处理的小块,然后对这些小块进行排序,最后将排序后的小块合并成有序的大块。外排序算法的基本思想是将大规模数据分割成能够在内存中处理的小块,然后对这些小块进行排序,最后将排序后的小块合并成有序的大块。外排序算法的基本思想是将大规模数据分割成能够在内存中处理的小块,然后对这些小块进行排序,最后将排序后的小块合并成有序的大块。外排序算法的基本思想是将大规模数据分割成能够在内存中处理的小块,然后对这些小块进行排序,最后将排序后的小块合并成有序的大块。 阅读详情

排序算法

 

直接插入排序

  • 时间复杂度: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实现外部排序 本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。引言外部排序法:外部排序分为独立的两部分组成:1.按可用内存大小,利用内部排序方法,构造若干个记... 阅读详情

相关推荐

八种排序算法比较总结

详细总结了和分析了八种排序算法的比较 包括稳定性的比较和时间空间复杂度的比较

python 经典排序方法及优势比较

文章目录python 经典排序方法及优势比较冒泡排序选择排序插入排序希尔排序快速排序归并排序 python 经典排序方法及优势比较 冒泡排序 冒泡排序思想:遍历整个数据列表,在一组数据中,每遍历比较一次数据,最大的数便会“冒泡”到数据列表右端 def bubble_sort(arr): for i in range(len(arr)): for j in range(len(arr)-i-1): # 最后的数自动排列到正确位置 if arr[j] >

半岛铁盒 542

Python实现大文件排序的方法

主要介绍了Python大文件排序的方法,涉及Python针对文件、缓存及日期等操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下

堆排序

堆 堆是一个特殊的完全二叉树,特点是每个父节点都会大于子节点或者每个父节点都会小于子节点。 完全二叉树 百度百科:如果一棵具有n个结点的深度为k的二叉树,它的每一个结点都与深度为k的满二叉树中编号为1~n的结点一一对应,这棵二叉树称为完全二叉树。 大概意思就是图二这种属于完全二叉树,感觉节点是一层一层塞满的,具体定义可以翻阅数据结构中的定义。 上图就是一个堆,1小于2,3...

a693076854的博客 793

Python量化交易实战:如何用vnpy+Tushare获取股票历史数据(附完整代码)

本文详细介绍了如何利用vn.py框架与Tushare数据接口,构建一个健壮的Python量化交易数据获取引擎。通过封装Tushare API,实现股票历史数据的自动化获取与格式转换,并适配vn.py的BarData结构,为策略回测与实盘交易提供稳定、高效的数据基础。文中提供了完整的代码实现,涵盖环境配置、核心封装逻辑及高级功能扩展。

cola5的博客 1218

MIT Bevfusion环境安装 Docker方式,nuscenes数据处理

Bevfusion环境安装,数据生成报错解决module 'numpy' has no attribute 'long';most likely due to a circular import。bevfusion docker环境

Jack_Man_N的博客 1143

八大排序[超级详细](动图+代码优化)这一篇文章就够了

排序🍭所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持 不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳 定的;否则称为不稳定的。堆排序使用堆来选数,相比直接选择排序效率就高了很多。堆排序中每一趟都有元素归位了时间复杂度:最好/最环/平均时间复杂度:O(N*logN)

冷兮雪的博客 6626

三电平逆变器LC滤波设计避坑指南:从SVPWM谐波到Simulink仿真验证

本文详细解析了三电平逆变器LC滤波设计中的关键问题,从SVPWM谐波特性到Simulink仿真验证,提供了800V/10kW系统的参数计算方法和优化技巧。通过实际案例和仿真配置示例,帮助工程师避免常见设计误区,提升电能质量和系统稳定性。

weixin_29261711的博客 172

chatgpt赋能python:Python八大排序算法:介绍和优缺点比较

本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。作为通用的Aigc大模型,只是展现它原本的实力。对于颠覆工作方式的ChatGPT,应该选择拥抱而不是抗拒,未来属于“会用”AI的人。🧡AI职场汇报智能办公文案写作效率提升教程 🧡专注于AI+职场+办公方向。下图是课程的整体大纲下图是AI职场汇报智能办公文案写作效率提升教程中用到的ai工具。

shengcaiy123的博客 328

Multisim14安装失败?手把手教你彻底清理残留文件(附专用卸载工具)

本文针对Multisim14安装失败问题,提供了一套从根源解决的完整方案。文章详细分析了安装失败的三大元凶——文件残留、注册表残留和隐藏组件,并手把手指导用户使用专用卸载工具进行标准化清理,再结合手动深度清理文件系统和注册表,最终实现彻底卸载和完美重装,有效解决Multisim14安装问题。

weixin_29179311的博客 317

YOLOv11改进策略【Neck】| SEAM:分离和增强注意模块,解决复杂场景下的小目标遮挡问题

本文记录的是利用 SEAM 模块优化 YOLOv11 的目标检测网络模型。的设计出发点在于解决复杂场景下的人脸遮挡问题,相当于是小目标被其他物体部分遮挡时,传统方法因特征缺失导致检测精度下降的问题。该模块通过增强未遮挡区域的特征响应并补偿被遮挡区域的信息损失,提升模型对遮挡小目标的检测能力。YOLO-FaceV2: A Scale and Occlusion Aware Face DetectorSEAM模块(Separated and Enhancement Attention Module)的设计出发点

Limiiiing的博客 2280

八大排序 python_python实现八大排序算法(2)

本文接上一篇博客python实现的八大排序算法part1,将继续使用python实现八大排序算法中的剩余四个:快速排序、堆排序、归并排序、基数排序5、快速排序快速排序是通常被认为在同数量级(O(nlog2n))的排序方法中平均性能最好的。算法思想:已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先任取数据a[x]作为基准。比较a[x]与其它数据并排序,使a[x]排在数据的第k...

weixin_39950552的博客 117

YOLO26 终极蒸馏指南:从入门到 SOTA (The Ultimate Distillation Guide)

《YOLO26 蒸馏技术指南》深入解析了知识蒸馏在目标检测中的应用,提出五大蒸馏范式:响应蒸馏(学习最终输出)、特征蒸馏(模仿中间特征)、关系蒸馏(捕捉通道关联)、CWD(通道语义对齐)和FGD(前景背景分离)。实验表明,"Response KD + CWD + FGD"组合效果最佳,使YOLO26n在0.5ms推理速度下达到0.956 mAP50,甚至超越教师模型。指南提供模块化代码实现和超参数调优建议,强调蒸馏能平衡模型精度与效率,是轻量化部署的有效方案。

weixin_51988935的博客 717

python八大排序算法_python实现八大排序算法(2)

本文接上一篇博客python实现的八大排序算法part1,将继续使用python实现八大排序算法中的剩余四个:快速排序、堆排序、归并排序、基数排序5、快速排序快速排序是通常被认为在同数量级(O(nlog2n))的排序方法中平均性能最好的。算法思想:已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先任取数据a[x]作为基准。比较a[x]与其它数据并排序,使a[x]排在数据的第k...

weixin_39554775的博客 167

基于STM32L4XX、HAL库的MCP4561数字电位器驱动程序设计

/ HAL库需要左移一位。* @param address: 设备地址(0x2C-0x2F)* @param hmcp: MCP4561句柄。* @param hmcp: MCP4561句柄。* @param hmcp: MCP4561句柄。* @param hmcp: MCP4561句柄。* @param hmcp: MCP4561句柄。* @param hmcp: MCP4561句柄。* @param hmcp: MCP4561句柄。* @param hi2c: I2C句柄。

zhusl6688的博客 340

筹码峰五句口诀,看懂主力的秘密动作!(附实战图示)

筹码图的价值在于,它不像K线那样容易造假。主力可以骗线,但骗不了筹码分布。主力在不在;是吸筹还是出货;接下来是变盘还是震荡。这五句口诀可以说是“筹码阅读的入门圣经”:单峰坚挺变盘在即,双峰对垒高抛低吸;上峰不移主力在跑,多峰林立行情不止;下峰不移不离不弃,筹码识庄稳中取利!📌市场从来不是靠猜,而是靠看清。筹码,就是主力最真实的痕迹。如果你想学会提前布局、跟庄不被甩,学会看筹码峰——这一步必须打牢!

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1161

python实现的八大排序算法part2

使用python实现八大排序算法中的剩余四个:快速排序、堆排序、归并排序、基数排序 桶排序/基数排序

Lockey23的博客 568

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

chatgpt赋能python:Python八大排序算法

本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。作为通用的Aigc大模型,只是展现它原本的实力。对于颠覆工作方式的ChatGPT,应该选择拥抱而不是抗拒,未来属于“会用”AI的人。🧡AI职场汇报智能办公文案写作效率提升教程 🧡专注于AI+职场+办公方向。下图是课程的整体大纲下图是AI职场汇报智能办公文案写作效率提升教程中用到的ai工具。

aijinglingchat的博客 145

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

十大排序方法思想及优缺点详细介绍

直接插入排序:Straight Insertion Sort 二分法插入排序: Binary Sort 希尔排序:Shell Sort 直接选择排序:Straight Select Sort 堆排序:Heap Sort 交换排序:Swap Sort 快速排序:Quick Sort 基数排序:Radix Sort 归并排序:Merge sort ...

udadau的博客 528

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

python实现的八大排序算法part1

内部排序和外部排序 Python实现冒泡排序、插入排序、希尔排序、快速排序、直接选择排序、堆排序、归并排序、基数排序这八大排序算法。

Lockey23的博客 880

Python动图展示八大常用排序算法,让你一次看个够

Hello,大家好,我是程序员小八~ 本文介绍常见的八大排序算法:直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快排、归并排序以及计数排序 文章内容很干,也很长,不过有多种动图图解,希望可以给枯燥的算法学习带来一抹亮色! 如果对于复杂度还不清楚,可以查看下面的文章 冒泡排序 对于冒泡排序相信我们都比较熟悉了,其核心思想就是相邻元素两两比较,把较大的元素放到后面,在一轮比较完成之后,最大的元素就位于最后一个位置了,就好像是气泡,慢慢的浮出了水面一样 defbubble_sort(da.

z099164的博客 1712

【S-排序】python实现八大排序算法之3-插入排序

插入排序 算法原理: python顺序表插入法排序:插入排序的主要思想是每次取一个列表元素与列表中已经排序好的列表段进行比较,然后插入从而得到新的排序好的列表段,最终获得排序好的列表 优点:稳定,快; 缺点:比较次数不一定,比较次数越多,插入点后的数据移动越多,特别是当数据总量庞大的时候,但用链表可以解决这个问题。 算法复杂度: - 如果目标是把n个元素的序列升序排列,那么采用...

小狐狸 1144

常见的排序算法总结及python实现

来自剑指offer:面试官经常要求应聘者比较插入排序、冒泡排序,归并排序、快速排序等不同算法的优劣,要求能够从额外空间开销、平均时间复杂度和最差时间复杂度去比较它们的优缺点。快排是重点。 概述 1.1 排序的稳定性 令狐冲的成绩和张无忌的成绩一样,未排序时令狐冲在前,排序后令狐冲依然在前,这样就是稳定的排序。 如果二者颠倒,那就是不稳定的排序。 1.2 内外排序 内排序是指在排序的整个...

owenfy的博客 329

数据结构——八大排序算法(python实现)

排序的方法很多,但就全面性性能而言,很难提出一种被认为是最好的方法。每一种方法都有自己的优缺点,适合在不同的环境下使用。目前评价排序算法的好坏的标准主要有两点,一个是执行时间,另一个是辅助空间。 下面讲解下内部排序的八大算法,它们分别是插入排序的“直接插入排序”、“希尔排序”;交换排序的“冒泡排序”、“快速排序”;选择排序的“简单选择排序”、“堆排序”;“归并排序”;“基数排序”。 插入排...

小白一直白 1130

内部排序的方法实验报告_八大排序算法的Python实现

排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。1、插入排序描述插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,...

weixin_39723441的博客 520
上一篇: scrapy 解决ip问题
下一篇: 查询hdfs的数据量
唐僧不爱八戒
博客等级 码龄9年 158粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值