Python(冒泡排序、选择排序、插入法排序、快速排序,算法稳定性)

算法的稳定性

冒泡排序

# 冒泡排序
# 1 思想: 相邻位置两个元素比较, 前面的元素比后面的元素大则交换, 把最大的数给找到
#        经过一轮一轮的比较最终把序列给排序
# 2 关键点1: 两层for循环 外层循环控制多少轮 内层for循环控制比较次数
# 3 关键点2: 若遍历一遍没有数字交换 说明序列有序,退出本轮
# 4 稳定性: 相邻两元素若相等则不交换,说明能保持原有序列的顺序 所以是算法是稳定的
# 5 算法复杂度: O(n^2), 最差时间复杂度O(n^2), 最优时间复杂度O(n)# 冒泡从小到大排序,实现步骤
# 1 数列长度 n
# 2 外层循环控制 轮次 j / n-1
# 3 内层循环控制 比较次数(相邻位置2个元素比较次数) i / n-j-1
# 4 若遍历一遍没有数字交换 说明序列有序 退出本轮次def bubble_sort(alist):length=len(alist)count=0for j in range(length-1):for i in range(length-j-1):if alist[i]>alist[i+1]:alist[i],alist[i+1]=alist[i+1],alist[i]count+=1if count==0:breakreturn alistif __name__=='__main__':bubble_sort([2,6,7,5,8,9])print(bubble_sort([2,6,7,5,8,9]))

选择排序

# 选择排序
# 1 思想: 第1个轮次: 序列中选择一个最小的放在第1个位置
#           第2轮次: 序列中选择一个第2小最的元素放在第2个位置
#        经过一轮一轮的比较最终把序列给排序# 2 关键点1: 两层for循环 外层循环控制多少轮 内层for循环控制比较次数
# 3 稳定性: 不稳定算法(数值相等的数据 前后位置可能会互换)
# 4 算法复杂度: O(n^2), 最差时间复杂度O(n^2), 最优时间复杂度O(n^2)# 选择从小到大排序,实现步骤
# 1 数列长度 n
# 2 外层循环控制 轮次 j / n-1
# 3 内层循环控制 比较次数(相邻位置2个元素比较次数) i / (j+1, n)
# 4 若假定的最小值下标发生变化, 就进行交换 min_index!=j
def select_sort(alist):"""选择排序"""# 列表的长度n = len(alist)# 外层循环 控制比较轮数for j in range(0, n-1):# 假定的最小值的下标min_index = j# 内层循环 控制比较次数for i in range(j+1, n):# 进行比较获得最小值if alist[i] < alist[min_index]:min_index = i# 若假定的最小值下标发生变化, 就进行交换if min_index != j:alist[j], alist[min_index] = alist[min_index], alist[j]if __name__ == '__main__':alist = [5, 3, 4, 7, 2]select_sort(alist)print(alist)def select_sort3(alist):n = len(alist)for i in range(0, n-1):for j in range(i+1, n):if alist[j] < alist[i]:alist[i], alist[j] = alist[j], alist[i]def select_sort2(alist):n = len(alist)for j in range(0, n-1):for i in range(j+1, n):if alist[i] < alist[j]:alist[i], alist[j] = alist[j], alist[i]

 

插入法排序

# 选择排序
# 1 思想: 有2个序列,有序序列和无序序列, 将无序序列中的每一个元素插入到有序序列
#        经过一轮一轮的比较最终把序列给排序# 2 关键点1: 有序序列遍历是从后向前
# 3 稳定性: 稳定算法(数值相等的数据 前后位置不互换)
# 4 算法复杂度: O(n^2), 最差时间复杂度O(n^2), 最优时间复杂度O(n)# 插入法从小到大排序,实现步骤
# 1 数列长度 n
# 2 外层循环控制 轮次 j / (1,n)
# 3 内层循环控制 插入位置 for i in range(j, 0, -1): if alist[i] < alist[i-1]:
# 4 若待插入数据小于有序数据,则插入; 若待插入数据大于有序数据,则breakdef insert_sort(alist):n = len(alist)#外层控制循环轮数for j in range(1,n):#第一个元素作为有序序列,从第二个元素开始进行比较for i in range(j,0,-1):# alist[i]为待插入的数据# 若待插入数据小于有序数据,则插入; 若待插入数据大于有序数据,则breakif alist[i]<alist[i-1]:#大于或者小于号控制降序或者升序# alist[i-1],alist[i]=alist[i],alist[i-1]#同样的效果,就是互换位置alist[i], alist[i - 1] = alist[i - 1], alist[i]else:breakif __name__ == '__main__':alist = [1, 100, 99, 20, 5, 1000]insert_sort(alist)print(alist)

 

 

快速排序

# start作用:    从左向右找比 mid 值更大的,往右面放
# end作用:      从右往左找比 mid 值小的,往左放# 快速排序思路
# 1 准备界限值
# 2 从右边寻找大于界限值的值, 找到后赋值给右边
# 3 从左边寻找大于界限值的值, 找到后赋值给右边
# 4 右边和右边的游标都发生变化了 判断是否重叠# 若不重叠 重复23,直到重叠# 若不重叠 1个轮次完毕 边界值加入序列
# 5 递归调用 # 界限值左边序列递归 界限值右边序列递归# 编程具体步骤:
# 1 准备界限值
# 1-1递归结束条件 if start >= end: 1-2界限值 mid = alist[start] 1-3左右游标left right
# 2 从右边寻找大于界限值的值, 找到后赋值给右边
# 2-1 while alist[right] >= mid and : right -= 1 / 2-2 alist[left] = alist[right]
# 3 从左边寻找大于界限值的值, 找到后赋值给右边
# 3-1 while alist[left] < mid and :  left += 1 /3-2 alist[right] = alist[left]# 4 右边和右边的游标都发生变化了 判断是否重叠; 若不重叠 重复23, 直到重叠, 1个轮次完毕
# 不重叠4-1while left < right: / 挑出循环 4-2 alist[left] = mid# 5 递归调用
# 界限值左边序列递归 5-1 quick_sort(alist, start, left-1)
# 界限值右边序列递归 5-2 quick_sort(alist, right+1, end)#   降序排列
# def quick_sort(alist, start, end):
#     # 1 准备界限值
#     # 1-1递归结束条件 if start >= end: 1-2界限值 mid = alist[start] 1-3左右游标left right
#     if start>=end:
#         return
#     mid=alist[start]
#     left=start
#     right=end
#     while left<right:
#         while alist[right]<mid and left<right:
#             right-=1
#         alist[left]=alist[right]
#         while alist[left]>mid and left<right:
#             left+=1
#         alist[right]=alist[left]
#     alist[left]=mid
#
#     quick_sort(alist,start,left-1)
#     quick_sort(alist,right+1,end)
#
#
# if __name__ == '__main__':
#     # alist = [1,2,100,50,1000,0,1,1]
#     # alist = [5, 8, 2, 1, 9, 6, 7, 4, 13]
#     alist = [5, 8, 2, 1, 9, 6, 7, 4, 3]
#     quick_sort(alist, 0, len(alist)-1)
#     print(alist)
def quick_sort(alist, start, end):# 1 准备界限值# 1-1递归结束条件 if start >= end: 1-2界限值 mid = alist[start] 1-3左右游标left rightif start >= end:returnmid = alist[start]left = startright = endwhile left < right:# 2 从右边寻找大于界限值的值, 找到后赋值给右边# 2-1 while alist[right] >= mid and : right -= 1 / 2-2 alist[left] = alist[right]while alist[right] >= mid and left < right:right -= 1alist[left] = alist[right]# 3 从左边寻找大于界限值的值, 找到后赋值给右边# 3-1 while alist[left] < mid and :  left += 1 /3-2 alist[right] = alist[left]while alist[left] < mid and left < right:left += 1alist[right] = alist[left]alist[left] = mid# 5 递归调用# 界限值左边序列递归 5-1 quick_sort(alist, start, left-1)# 界限值右边序列递归 5-2 quick_sort(alist, right+1, end)quick_sort(alist, start, left-1)quick_sort(alist, right+1, end)if __name__ == '__main__':# alist = [1,2,100,50,1000,0,1,1]# alist = [5, 8, 2, 1, 9, 6, 7, 4, 13]alist = [5, 8, 2, 1, 9, 6, 7, 4, 3]quick_sort(alist, 0, len(alist)-1)print(alist)

 

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

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

相关文章

【自用】NLP算法面经(5)

一、L1、L2正则化 正则化是机器学习中用于防止过拟合并提高模型泛化能力的技术。当模型过拟合时&#xff0c;它已经很好地学习了训练数据&#xff0c;甚至是训练数据中的噪声&#xff0c;所以可能无法在新的、未见过的数据上表现良好。 比如&#xff1a; 其中&#xff0c;x1和…

PyCharm安装redis,python安装redis,PyCharm使用失败问题

报错信息 Usage: D:\wb2\wbrj_pys\venv\Scripts\python.exe -m pip install [options] [package-index-options] … D:\wb2\wbrj_pys\venv\Scripts\python.exe -m pip install [options] -r [package-index-options] … D:\wb2\wbrj_pys\venv\Scripts\python.exe -m pip instal…

学习笔记|arduino uno r3|DS1307时钟芯片|Atmega328P| 设置时间|读取时间|无源晶振:DS1307时钟芯片实验

目录 芯片pinout&#xff1a; 实验器件&#xff1a; 实验连线 解决AVR 架构不支持 printf() 方法 使用GetTimeAndDate.ino设置时间&#xff1a; 使用SetTimeAndDate.ino设置时间&#xff1a; 芯片pinout&#xff1a; DS1307 是美国 DALLAS 公司推出的 I 总线接口实时时钟芯…

uniapp可拖拽消息数徽标draggable-badge,仿手机qq聊天列表未读数徽标动效

组件下载地址&#xff1a;https://ext.dcloud.net.cn/plugin?id22679 兼容性&#xff1a; 测试了h5和微信小程序&#xff0c;理论支持全平台&#xff0c;暂不支持pc端&#xff0c;不过可以自己修改事件兼容pc 使用uniapp仿写了一个手机qq聊天列表右侧未读数的徽标组件&#x…

【设计模式】策略模式

以下是格式优化后的Markdown文档&#xff0c;仅调整代码缩进&#xff0c;保持内容不变&#xff1a; 四、策略模式 策略(Strategy) 模式是一种行为型模式&#xff0c;其实现过程与模板方法模式非常类似——都 是以扩展的方式支持未来的变化。本章通过对一个具体范例的逐步重构…

STM32配套程序接线图

1 工程模板 2 LED闪烁 3LED流水灯 4蜂鸣器 5按键控制LED 6光敏传感器控制蜂鸣器 7OLED显示屏 8对射式红外传感器计次 9旋转编码器计次 10 定时器定时中断 11定时器外部时钟 12PWM驱动LED呼吸灯 13 PWM驱动舵机 14 PWM驱动直流电机 15输入捕获模式测频率 16PWMI模式测频率占空…

【C语言】使用结构体实现位段

一、位段 前面我们学习了结构体&#xff0c;位段的声明和结构体是一样的&#xff0c;其区别如下&#xff1a; 1、位段的成员必须是int 、unsigned int 、signed int 、在C99中位段的成员的类型也可以选择其他类型。 2、位段的成员名后边有一个冒号和一个数字 如下&#xff…

【大模型系列篇】硅基智能开源数字人模型HeyGem.ai,开启数字人时刻

硅基智能开源数字人模型HeyGem.ai, 1秒克隆生成4K视频, 支持离线多语言, 开源72小时狂揽1.3k星, 目前已经获得3.4k星。 硅基智能正式宣布在GitHub开源全球TOP级数字人模型&#xff0c;同时发布基于该模型的同名数字人工具硅基数字人克隆的本地安装包&#xff0c;这一举措标志着…

【C++】STL库面试常问点

STL库 什么是STL库 C标准模板库&#xff08;Standard Template Libiary&#xff09;基于泛型编程&#xff08;模板&#xff09;&#xff0c;实现常见的数据结构和算法&#xff0c;提升代码的复用性和效率。 STL库有哪些组件 STL库由以下组件构成&#xff1a; ● 容器&#xf…

knowledge-微前端(多个前端应用聚合的一个应用架构体系,每个小的应用可独立运行,独立开发,独立部署上线)

1.前言 微前端&#xff0c;将一个大的前端应用拆分为多个小型的&#xff0c;独立开发的前端应用&#xff0c;每一个小型的应用都可以单独的开发&#xff0c;部署和运行。这种结构允许不同的团队使用不同的技术栈来开发应用的不同部分&#xff0c;提高开发的效率与灵活性。 2.实…

三格电子PLC数据采集网关-工业互联的智能枢纽

在工业自动化领域&#xff0c;设备间的数据互通与协议兼容是核心挑战之一。三格电子推出的PLC据采集网关SG-PLC-Private&#xff0c;凭借其多协议兼容、高稳定性和灵活配置能力&#xff0c;成为工业物联网&#xff08;IIoT&#xff09;中实现设备互联的关键设备。本文将从产品功…

鸿蒙NEXT项目实战-百得知识库05

代码仓地址&#xff0c;大家记得点个star IbestKnowTeach: 百得知识库基于鸿蒙NEXT稳定版实现的一款企业级开发项目案例。 本案例涉及到多个鸿蒙相关技术知识点&#xff1a; 1、布局 2、配置文件 3、组件的封装和使用 4、路由的使用 5、请求响应拦截器的封装 6、位置服务 7、三…

leetcode热题100道——字母异位词分组

给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "nat", &…

【Vue3】01-vue3的基础 + ref reactive

首先确保已经有了ES6的基础 本文介绍 vue 的基础使用以及 两种响应数据的方式。 目录 1. 创建一个vue应用程序 2. Vue模块化开发 3. ref 和 reactive 的区别 1. 创建一个vue应用程序 所需的两个文件&#xff1a; https://unpkg.com/vue3/dist/vue.global.js https://un…

Linux中的selinux,磁盘管理

一、selinux 作用&#xff1a;通过对软件进程限制某些权限&#xff0c;从而保证系统的安全。通过上下文类型和设定好的上下文类型是否一致。如果一致&#xff0c;那么软件就可以完成后续的操作&#xff0c;例如访问文件中数据&#xff0c;或者让数据通过某个端口。做好个人防护…

Linux应用:Linux的信号

什么是信号 信号是一种软件中断&#xff0c;用于通知进程系统中发生了某种特定事件。它是操作系统与进程之间&#xff0c;以及进程与进程之间进行异步通信的一种方式。在 Linux 系统中&#xff0c;信号是一种比较简单的进程间通信机制。当一个信号产生时&#xff0c;内核会通过…

Linux笔记之Ubuntu22.04安装IBus中文输入法教程

Linux笔记之Ubuntu22.04安装IBus中文输入法教程 code review&#xff01; 文章目录 Linux笔记之Ubuntu22.04安装IBus中文输入法教程安装 IBus 并配置中文输入法步骤 1: 安装 IBus 和拼音插件步骤 2: 设置 IBus 为默认输入法框架步骤 3: 重启会话步骤 4: 添加中文输入法步骤 5: …

【AIGC前沿】MiniMax海螺AI视频——图片/文本生成高质量视频

目录 1.MiniMax海螺AI视频简介 2.使用教程 1.MiniMax海螺AI视频简介 海螺视频&#xff0c;作为 MiniMax 旗下海螺 AI 平台精心打造的 AI 视频生成工具&#xff0c;致力于助力用户产出高品质视频内容。该工具依托 abab-video-1 模型&#xff0c;具备强大的文生视频功能。用户…

Kubeasz工具快速部署K8Sv1.27版本集群(二进制方式)

文章目录 一、基本信息二、服务器初始化操作三、使用Kubeasz部署K8S集群四、验证集群 一、基本信息 1、部署需要满足前提条件&#xff1a; 注意1&#xff1a;确保各节点时区设置一致、时间同步&#xff1b;注意2&#xff1a;确保在干净的系统上开始安装&#xff1b;注意3&…

在VMware上部署【Ubuntu】

镜像下载 国内各镜像站点均可下载Ubuntu镜像&#xff0c;下面例举清华网站 清华镜像站点&#xff1a;清华大学开源软件镜像站 | Tsinghua Open Source Mirror 具体下载步骤如下&#xff1a; 创建虚拟机 准备&#xff1a;在其他空间大的盘中创建存储虚拟机的目录&#xff0c…