Python的排序算法

一、算法

1.1 算法概念

算法就是计算机解决问题的方法或者步骤

程序 = 数据结构 + 算法

1.2 算法的特性

1】确定性: 算法的每条语句具有明确的意思,不能模棱两可

2】有穷性:在执行一定的时间后,能自动结束算法

3】输入:至少有0个或者多个的输入

4】输出:至少要有一个输出

5】可行性:经济可行,社会可行

1.3 算法的设计要求

1】正确性:对于正确的输入,会给出正确的结果。

2】健壮性:对于错误的输入,要给出合理的处理

3】可读性:要代码有适当的注释,命名规范

4】高效率:要求时间复杂度尽可能低

5】低存储:空间复杂度尽可能低

1.4 算法时间复杂度(T(n))

1> 算法时间复杂度计算公式:T(n) = O(f(n));

T(n):时间复杂度

n:表示问题的规模

f(n) :是问题规模与执行次数之间的函数

O(f(n)):使用O阶记法,记录算法时间复杂度

2> 时间复杂度推导

3> 常见的时间复杂度

二、排序算法

2.1 概念

1】定义:将给定的序列,按照特定的顺序进行排列的一种算法

2】种类:

1.交换类排序:冒泡排序、快速排序

2.选择类排序:简单选择排序、堆排序

3.插入类排序:直接插入排序、折半插入排序、希尔排序

4.归并排序:二路归并、三路归并。。。

5.基数排序

2.2 冒泡排序

概念和原理:

冒泡排序:是一种简单的排序算法,它重复的遍历要排序的序列,一次比较两个元素,如果他们的顺序错误,就把他们交换过来。

冒泡排序算法的运作如下:

  • 比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个。
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  • 针对所有的元素重复以上的步骤,除了最后一个。
  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

时间复杂度:O(n^2)

算法实现:

#定义冒泡函数
def bubble_sort(alist):j=0while j<len(alist): #确定序列中数据i=0while i<len(alist)-1-j: #一个序列中两两比较的次数if alist[i] > alist[i+1]:  #前一个元素比后一个元素大 交互alist[i],alist[i+1] = alist[i+1],alist[i]i+=1j+=1

2.3 选择排序

概念和原理:

选择排序:选择出当前序列中最小或者最大元素的所在的下标,再将最小元素和第一个位置交换(再将最大元素和最后一个位置交换),再找出剩下元素中最小或者最大元素的所在的下标,再将最小元素和第二个位置交换(再将最大元素和最后二个位置交换),以此类推

时间复杂度:O(n^2)

算法实现:

#定义选择排序算法
def select_sort(alist):i = 0 #当前序列中的第一个元素while i<len(alist)-1:min_idex = i #min_idex最小元素所在的下标 一开始就把第一个元素当成最小的j = i+1  #使用j遍历当前序列中后面所有的元素while j<len(alist):if alist[min_idex] > alist[j]: #alist[j] < alist[min_idex]min_idex = jj+=1if min_idex != i:#将min_idex下标的元素放到第i位置上  交互alist[i],alist[min_idex] = alist[min_idex],alist[i]i+=1

2.4 直接插入排序 (抓牌)

概念和原理:

1】定义:每次将待排序中的第一个元素,放入已排序列表中对应的位置

2】原理:每一步从待排序列中选取第一个元素,将其插入到之前已排序序列中,直到待排序列所有元素排完,则结束排序

时间复杂度:O(n^2)

算法实现:

#定义直接插入排序算法
def insert_sort(alist):i = 1 #记录待排序列中的第一个位置  从第二个元素开始while i < len(alist):temp = alist[i]j = iwhile temp < alist[j-1] and j>0: #如果当前这个元素比前面的元素小#前面的元素后移alist[j] = alist[j-1]j-=1alist[j] = temp #将当前要插入的位置 将值赋值进来i+=1li = [54,26,93,17,77,31,44,55,20]
insert_sort(li)
print(li)

2.5 快速排序

概念和原理:

1】定义:快速排序是在序列元素与选定基准比较分割为大小两个部分的排序

基准(piovt)

2】原理:

1.从待排序列中,选定一个基准

2.以此为基准,将待排序列分为大小两个部分

3.对每个部分,再次选择一个基准,进行上述操作

4.直到每一个部分只有一个元素时,则排序成功

时间复杂度:O(n^2)

算法实现:

#定义第一趟快排函数
def part(alist,L,R):#定义基准p = alist[L]while L<R:while alist[R]>=p and L<R:R-=1alist[L] = alist[R] #将比基准小的数据放在左边while alist[L] <= p and L<R:L+=1alist[R] = alist[L] #将比基准大的数据放在右边#当L==R 说明只剩最后一个元素-->基准,L或者R就是基准所在的位置alist[L] = preturn L  #基准所在的下标#定义快排函数
def quick_sort(alist,L,R):if L<R:#进行第一次快排,p_idex = part(alist,L,R)#将基准左侧的序列再次进行快排quick_sort(alist,L,p_idex-1)#将基准右侧的序列再次进行快排quick_sort(alist,p_idex+1,R)li = [54,26,93,17,77,31,44,55,20]
quick_sort(li,0,len(li)-1)
print(li)

2.6 希尔排序(了解)

概念和原理:

希尔排序是插入排序的一种,也称为缩小量排序。

原理:将序列在一个表中并对序列分别进行插入排序,重复过程,不过每次用更长的序列(步长更长了,列数更少了)

时间复杂度:O(n^2)

算法实现

#定义希尔排序算法
def shell_sort(alist):#获取元素总个数n=len(alist)#设置初始步长gap = n//2while gap > 0:#按步长进行插入for i in range(gap,n):j = iwhile j>=gap and alist[j-gap] > alist[j]:alist[j-gap],alist[j] = alist[j],alist[j-gap]j-=gap#更新步长gap = gap // 2alist = [49,58,65,97,26,13,27,49,55,4]
shell_sort(alist)
print(alist)

2.7 归并排序

概念和原理:

1】归并排序是采用分治法的一种典型的应用

2】归并排序的思想就是先递归分解序列,再合并序列

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

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

相关文章

npm install -g@vue/cli报错解决:npm error code ENOENT npm error syscall open

这里写目录标题 报错信息1解决方案 报错信息2解决方案 报错信息1 使用npm install -gvue/cli时&#xff0c;发生报错&#xff0c;报错图片如下&#xff1a; 根据报错信息可以知道&#xff0c;缺少package.json文件。 解决方案 缺什么补什么&#xff0c;这里我们使用命令npm…

在windows操作系统上,用git与github账户连接

一、环境准备 1.1 git软件 1.2 github账号 1.3 创建一个项目目录&#xff0c;比如 D:\project\gitproject 二、开始操作 1. 进入项目目录下&#xff0c;右键&#xff0c;如图&#xff0c;打开git bash命令行 2. 在命令行输入以下三个命令 $ git config --global user.name &quo…

视频监控实现画面缩放功能

文章目录 概要一、功能说明二、核心实现代码三、技术细节 概要 在视频监控系统中&#xff0c;经常需要查看视频画面中的细节。通过实现区域放大、滚轮缩放和拖拽平移等功能&#xff0c;可以让用户更方便地观察视频细节。本文介绍如何在 Windows 系统下实现这些交互功能。 一、…

鸿蒙本地模拟器 模拟TCP服务端的过程

鸿蒙模拟器模拟TCP服务端的过程涉及几个关键步骤&#xff0c;主要包括创建TCPSocketServer实例、绑定IP地址和端口、监听连接请求、接收和发送数据以及处理连接事件。以下是详细的模拟过程&#xff1a; **1.创建TCPSocketServer实例&#xff1a;**首先&#xff0c;需要导入鸿蒙…

Three.js 和其他 WebGL 库 对比

在WebGL开发中&#xff0c;Three.js是一个非常流行的库&#xff0c;它简化了3D图形的创建和渲染过程。然而&#xff0c;市场上还有许多其他的WebGL库&#xff0c;如 Babylon.js、PlayCanvas、PIXI.js 和 Cesium&#xff0c;它们也有各自的特点和优势。本文将对Three.js 与这些常…

【04】MySQL数据库和数据表的基本操作详解与实例

文章目录 一、连接MySQL服务器二、数据库的基本操作2.1数据库的基本操作1. 创建数据库2. 选择数据库3. 删除数据库4.查询所有数据库5.修改数据库的字符集 2.2 数据表的基本操作1. 创建数据表2. 查看数据表结构3. 删除数据表4. 修改数据表5. 插入数据6. 查询数据7. 更新数据8. 删…

CTF-Hub SQL 报错注入(纯手动注入)

​ 当输入1时&#xff0c;发现只有查询正确&#xff0c;基本上可以判断出没有回显 开始注入(工具hackerBar) 题目是报错注入&#xff0c;方向就比较明显&#xff0c;大致说一下用到的函数和原理。 常见报错注入函数&#xff1a; 通过 floor() 报错注入通过 extractValue() …

2024 阿里云的Debian12.8,安装mariadb【图文讲解】

目录 一、安装 MariaDB Server 二、登录到MariaDB&#xff0c;记得输入密码&#xff08;注意&#xff1a;密码非明文&#xff0c;只管输入&#xff0c;完成以后回车&#xff09; 三、创建用户 root&#xff0c;并允许从任何主机连接 四、授予用户访问权限 五、刷新权限 六、…

新用户引导库-driverjs

一个比好用的新用户引导的库 driverjs 在做这个功能时&#xff0c;首先要确定目标是什么样子的&#xff0c; 如果只是随意点击下一步下一步&#xff0c;那我感觉可能用图片轮播图的方式会快一点&#xff0c;更容易解决且方便&#xff0c;想要什么步骤 只需要更改图片就好&…

鸿蒙保存读取沙盒文件

鸿蒙保存读取沙盒文件 参考文件 有些时候需要保存并读取沙盒环境的文件。这样做保存一些临时文件&#xff0c;确保发送网络之前数据不会丢失&#xff0c;或者存储一些只需要在本地使用的数据等等。本文介绍一下相关的操作方式。 获取文件路径 想要保存或者读取文件&#xf…

八、利用CSS制作导航栏菜单的习题

题目一&#xff1a; 利用CSS技术&#xff0c;结合链接和样表&#xff0c;设计并实现“ 山水之间 ”页面。 运行效果&#xff1a; 代码 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>山水之间</title>&l…

ML 系列:第 31 节— 机器学习中的协方差和相关性

文章目录 一、说明二、协方差和相关性2.1 协方差的概念2.1 相关 三、有关关联的高级主题 &#xff08;有关详细信息&#xff09;3.1 相关性和独立性3.2 零相关性和依赖性示例 四、相关性和因果关系五、结论 一、说明 协方差量化了两个随机变量协同变化的程度。当一个变量的较高…

谈谈微服务的常用组件

由于微服务给系统开发带来了一些问题和挑战&#xff0c;如服务调用的复杂性、分布式事务的处理、服务的动态管理等&#xff0c;为了更好地解决这些问题和挑战&#xff0c;各种微服务治理的组件应运而生&#xff0c;充当微服务架构的基石和支撑&#xff0c;常用组件如下表&#…

2024算法基础公选课练习七(BFS1)

一、前言 还是偏基础的bfs&#xff0c;但是有几个题不是很好写 二、题目总览 三、具体题目 3.1 问题 A: 数据结构-队列-奇怪的电梯 我的代码 可以看成求一维平面的bfs最短路 #include <bits/stdc.h> using i64 long long; using pii std::pair<int,int>; co…

探索.NET世界的无限可能——带你轻松了解.NET

前言 由于目前用到的技术栈有C#&#xff0c;而学习C#离不开.NET框架&#xff0c;正如学习Java离不开学习Spring框架一样。 .NET是微软开发的一个非常强大的框架&#xff0c;它不仅擅长桌面和移动开发&#xff0c;而且还能够支持Web开发和游戏引擎开发&#xff0c;在现在热门的…

[OpenHarmony5.0][Docker][环境]OpenHarmony5.0 Docker pull线上镜像方式构建编译环境

T. 已测试目录 主机类型主机版本Docker镜像版本结果WSL2Ubuntu22.04Ubuntu20.04PASSWSL2Ubuntu22.04Ubuntu18.04PASS R. 软硬件要求&#xff1a; 硬件&#xff1a; 设备容量备注硬盘>500G多版本系统测试&#xff0c;必须固态&#xff0c;否则编译卡死硬盘>300G单系统…

RHCE——SELinux

SELinux 什么是SELinux呢&#xff1f;其实它是【Security-Enhanced Linux】的英文缩写&#xff0c;字母上的意思就是安全强化Linux的意思。 SELinux是由美国国家安全局(NSA)开发的&#xff0c;当初开发的原因是很多企业发现&#xff0c;系统出现问题的原因大部分都在于【内部…

Python - 函数(四)

函数&#xff1a;在编写程序的过程中&#xff0c;有某一功能代码块出现多次&#xff0c; 但是为了提高编写的效率以及代码的重用&#xff0c;所以把具有独立功能的代码块组织为一个小模块&#xff0c;这就是函数 ‌Python中的函数‌是一组被命名的可执行代码&#xff0c;用于完…

代码随想录打卡DAY21

算法记录第21天 [二叉树] 1.LeetCode 538. 把二叉搜索树转换为累加树 题目描述&#xff1a; 给出二叉 搜索 树的根节点&#xff0c;该树的节点值各不相同&#xff0c;请你将其转换为累加树&#xff08;Greater Sum Tree&#xff09;&#xff0c;使每个节点 node 的新值等于原…

[在线实验]-ActiveMQ Docker镜像的下载与部署

镜像下载 下载ActiveMQ的Docker镜像文件。通常&#xff0c;这些文件会以.tar格式提供&#xff0c;例如activemq.tar。 docker的activemq镜像资源-CSDN文库 加载镜像 下载完成后&#xff0c;您可以使用以下命令将镜像文件加载到Docker中&#xff1a; docker load --input a…