5种排序算法

news2025/11/2 4:56:03

文章目录

  • 一,排序算法时间复杂度比较
  • 二,插入排序
  • 三,冒泡排序
  • 四,快速排序
  • 五,堆排序
  • 六,二分归并排序

一,排序算法时间复杂度比较

算法最坏情况下平均情况下
插入排序O(n² )O(n²)
冒泡排序O(n²)O(n²)
快速排序O(n²)O(nlogn)
堆排序O(nlogn)O(nlogn)
二分归并排序O(nlogn)O(nlogn)

二,插入排序

假设原始序列为:[5,7,1,3,6,2,4]
首先假设第一个元素5已经排好,然后插入第二个元素7但是7比5大所以7放在5的右边,接着是第三个元素1,1比7小所以再7左边并且1比5小所以放在5的左边。第四个元素3于7比较比7小在7左边并且比5小所以在5左边但是3比1小所以插入到1和5之间,其他的类似。。。。

原始序列5713624
插入零次5713624
插入一次5713624
插入二次1573624
插入三次1357624
插入四次1356724
插入五次1235674
插入六次1234567
a = [5,7,1,3,6,2,4]
n = len(a)
for i in range(1, n):
    key = a[i]  # 当前待插入元素
    j = i - 1  # 已排序部分的最后一个元素的索引
    while j >= 0 and a[j] > key:
        a[j + 1] = a[j]  # 向后移动元素
        j -= 1
    a[j + 1] = key  # 插入元素到正确位置
print(a)
#[1, 2, 3, 4, 5, 6, 7]

三,冒泡排序

假设原始序列为:[5,7,1,3,6,2,4]
首先5和7比较,5比7小不交换顺序,7和1比较,7比1大交换顺序,7和3比较,7比3大交换顺序,7和6比较7比6大交换顺序,7和4比较,7比4大交换顺序。以此类推

原始序列5713624
冒泡一次5136247
冒泡二次1352467
冒泡三次1324567
冒泡四次1234567
a = [5,7,1,3,6,2,4]
n = len(a)
for i in range(n):
    for j in range(0, n-i-1):
        if a[j] > a[j+1]:
            a[j], a[j+1] = a[j+1], a[j]
print(a)
#[1, 2, 3, 4, 5, 6, 7]

四,快速排序

假设原始序列为:[5,7,1,3,6,2,4]
首先以第一个元素5为划分的标准,从前面找第一个比5大的从后面找第一个比5小的交换位置,然后再找下一个比大的和比5小的交换位置。第二次交换是发生在两个相邻的元素之间做的所以说2前面的都比5小,6后面的都比5大所以2的位置是第一个元素5的位置,然后交换2和5的位置,这样5的位置就定下来了,再分别对两边递归调用同样的方法。

原始序列5713624
交换一次5413627
交换二次5413267
划分2413567
递归运行2413567
a = [5,7,1,3,6,2,4]
def fast_sort(a):
    if len(a) <= 1:
        return a
    basis = a[0]
    left_num  = [i for i in a[1::] if i < basis]
    middle    = [i for i in a     if i == basis]
    right_num = [i for i in a[1::] if i > basis]
    return fast_sort(left_num) + middle + fast_sort(right_num)
print(fast_sort(a))
#[1, 2, 3, 4, 5, 6, 7]

五,堆排序

pass

六,二分归并排序

它将待排序的列表递归地分成两个子列表,直到每个子列表只包含一个元素。然后,将这些子列表按照顺序合并,形成一个有序的列表。
假设原始序列为:[5,7,1,3,6,2,4]
首先先把序列一份为二 (标注和没标注的),然后对每个子列里面也分别进行二分归并排序,然后把已经排好的子数合并(两个序列的首元素比较哪个小就把哪个拿走,知道一个数组空了就把另一个数组全部接在后面)。

原始序列5713624
归分5413627
递归排序1345267
开始组合1345267
345267
新数组1
34567
新数组12
4567
新数组123
567
新数组1234
67
新数组12345
新数组1234567
a = [5, 7, 1, 3, 6, 2, 4]

def merge_sort(arr):
    if len(arr) <= 1:
        return arr
        
    mid = len(arr) // 2
    left = arr[:mid]
    right = arr[mid:]

    left = merge_sort(left)
    right = merge_sort(right)

    return merge(left, right)

def merge(left, right):
    merged = []
    i = j = 0

    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            merged.append(left[i])
            i += 1
        else:
            merged.append(right[j])
            j += 1

    while i < len(left):
        merged.append(left[i])
        i += 1

    while j < len(right):
        merged.append(right[j])
        j += 1

    return merged

print(merge_sort(a))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1068413.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LLMs 蒸馏, 量化精度, 剪枝 模型优化以用于部署 Model optimizations for deployment

现在&#xff0c;您已经了解了如何调整和对齐大型语言模型以适应您的任务&#xff0c;让我们讨论一下将模型集成到应用程序中需要考虑的事项。 在这个阶段有许多重要的问题需要问。第一组问题与您的LLM在部署中的功能有关。您需要模型生成完成的速度有多快&#xff1f;您有多…

Linux深度学习:除基本命令操作外的实用操作

Linux深度学习&#xff1a;除基本命令操作外的实用操作 软件安装systemctl软连接日期、时区IP地址、主机名网络传输下载和网络请求端口 进程管理主机状态系统资源监控磁盘信息监控网络状态监控 环境变量上传、下载压缩、解压root用户、用户、用户组管理查看、修改权限控制 软件…

windows动态配置多个JDK遇到的问题

环境变量配置如下&#xff1a;问题&#xff1a;当切换JAVA_HOME 为%JAVA17_HOME%,查看java版本还是java 11。 我检查path配置发现这个路径 删除这个路径配置&#xff0c;再切换JAVA_HOME的配置&#xff0c; 查看版本号这时就可以了

使用Python抓取某音数据详细步骤

某音作为当今最受欢迎的短视频平台之一&#xff0c;吸引了亿万用户的眼球。但是&#xff0c;你是否曾经想过如何通过Python来抓取某音数据&#xff1f;本文将揭示这个秘密&#xff0c;并分享使用Python来抓取某音数据的实用技巧&#xff0c;帮助你深入了解背后的数据世界。 第一…

【Go】excelize库实现excel导入导出封装(一),自定义导出样式、隔行背景色、自适应行高、动态导出指定列、动态更改表头

前言 最近在学go操作excel&#xff0c;毕竟在web开发里&#xff0c;操作excel是非常非常常见的。这里我选择用 excelize 库来实现操作excel。 为了方便和通用&#xff0c;我们需要把导入导出进行封装&#xff0c;这样以后就可以很方便的拿来用&#xff0c;或者进行扩展。 我参…

uni-app:服务器端数据绘制echarts图标(renderjs解决手机端无法显示问题)

效果 代码 <template><view click"echarts.onClick" :prop"option" :change:prop"echarts.updateEcharts" id"echarts" class"echarts"></view> </template><script>export default {data()…

MDK(Keil)的MAP文件都记录了啥

1.Section Cross References&#xff1a;译为各区域的交叉参考&#xff0c;记录了每个C文件调用了哪些其它文件的函数&#xff0c;内容很多所以这个部分相当长 2.Removing Unused input sections from the image&#xff1a;移除未使用的输入部分&#xff0c;记录哪些文件的哪些…

Quarto 入门教程 (2):如何使用并编译出不同文档

接着上一期内容&#xff1a;手把手教你使用 Quarto 构建文档 (1)&#xff0c;本文介绍如何使用 Quarto&#xff0c;并编译出文档&#xff08;PDF&#xff0c;MS Word&#xff0c;html&#xff09;等。 安装 根据官方链接&#xff0c;选择适合自己电脑的 Quarto 版本并下载&am…

【开发篇】二十一、SpringBoot整合Kafka

文章目录 1、整合2、消息的生产3、消费4、补充&#xff1a;安装 Kafka主体不是用来做消息中间件的&#xff0c;但也有这个功能&#xff0c;接下来整合Kafka 1、整合 导入依赖坐标&#xff1a; <dependency> <groupId>org.springframework.kafka</groupId&g…

聚观早报 | 微软将推出首款AI芯片;Galaxy S24系列首发

【聚观365】10月8日消息 微软将推出首款AI芯片 Galaxy S24系列首发 特斯拉将发布第三季度财报 台积电9月份营收56亿美元 2023国庆档新片总票房破27亿 微软将推出首款AI芯片 据外媒援引知情人士消息透露&#xff0c;微软计划在下个月举行的年度开发者大会上推出该公司首款…

【PG】Linux系统部署PostgreSQL 单机数据库

安装方式 1 安装包方式 &#xff08;Packages and Installers&#xff09; 支持的操作系统包括 liunxMacosWindowsBSDSolaris 2 源码安装 &#xff08;Source code&#xff09; 下载源码包 通过下载地址PostgreSQL: File Browser 可以看到有各个版本的源码目录 选择13.1…

80、90童年回忆之小霸王游戏机网页版

前言 在如今快节奏的生活中&#xff0c;我们常常追逐着最新潮流&#xff0c;迷失了曾经的经典与回忆。现在&#xff0c;有一种游戏机能够带你回到小时候&#xff0c;让你重温那些令人难以忘怀的游戏时光&#xff0c;这就是小霸王游戏机&#xff01; 作为 80 年代和 90 年代最受…

对于复杂二进制数位dp问题考虑朴素思想:agc015d

https://atcoder.jp/contests/agc015/tasks/agc015_d 我一开始考虑的是直接上二进制数位dp&#xff0c;但发现这很难做 然后其实可以从最朴素的二进制分类讨论角度考虑 同样是那么几个套路&#xff0c;考虑最高位

AXI总线协议基础--几分钟熟悉通道信号和基础架构

目录 一、AXI协议基础 1.1读写通道的基本架构图 1.2猝发操作举例 1.3传输顺序 二、各个通道中的信号描述 2.1全局信号 2.2写地址通道信号 2.3写数据通道信号 2.4写响应通道信号 2.5读地址通道信号 2.6读数据通道 三、通道握手 3.1单一信息传输时的握手过程 3.2不…

NPM 常用命令(九)

目录 1、npm link 1.1 使用语法 1.2 描述 2、npm login 2.1 描述 3、npm logout 3.1 描述 4、npm ls 4.1 使用语法 4.2 描述 5、npm org 5.1 使用语法 5.2 示例&#xff1a; 6、npm outdated 6.1 使用语法 6.2 描述 6.3 示例 7、npm owner 7.1 使用语法 7.2…

使用Spring Initailizr功能~

Spring Initializr是一个用于快速生成Spring Boot项目的在线工具&#xff0c;它允许用户选择所需的Spring Boot版本、添加所需的依赖&#xff0c;并生成一个可用的项目结构&#xff0c;包括基本的配置文件和代码框架&#xff0c;它能够简化Spring Boot项目的初始化过程&#xf…

高通camx开源部分简介

camera整体框架 ISP Pipeline diagram Simple Model Camx and chi_cdk 整体框架 CtsVerifier, Camra Formats Topology of Camera Formats. Topology (USECASE: UsecaseVideo) Nodes List Links between nodes Pipeline PreviewVideo Buffer manager Create Destro…

Centos7安装Redis7.x最新稳定版|配置开机启动(骨灰级|保姆级)

Python3中类的高级语法及实战 Python3(基础|高级)语法实战(|多线程|多进程|线程池|进程池技术)|多线程安全问题解决方案 Python3数据科学包系列(一):数据分析实战 Python3数据科学包系列(二):数据分析实战 Python3数据科学包系列(三):数据分析实战 Win11查看安装的Python路…

数据丢失怎么办?分享3个神仙方法!

“紧急求解答&#xff01;数据丢失了怎么用简单的方法恢复呀&#xff1f;电脑中保存了一些非常重要的数据&#xff0c;不知道怎么就不见了。有没有方法帮我找回来呀&#xff1f;” 在日常办公中&#xff0c;很多用户会将重要的数据保存在电脑中。这样有利于在需要时及时使用文件…

苹果iTunes如何备份数据?按照这几个步骤就可以了!

iTunes是什么&#xff1f;苹果iTunes是辅助用户使用苹果设备的一款功能强大的应用程序。使用过iTunes的苹果用户应该都不陌生&#xff0c;用户可以在iTunes上管理并播放音乐、电影、电视节目等媒体文件。此外&#xff0c;用户还可以通过iTunes来备份手机上的数据。 那么&#…