python基础算法-选择排序
前言:
选择排序(Selection sort)是一种直观的排序算法。
- 一趟排序记录最小的数,放到第一个位置,第一个位置的数跟最小的数位置调换
- 继续遍历列表无序列(即遍历第二遍就是第二个数)的数,放到第二个位置
- 依次遍历到列表结束
算法关键点:有序区和无序区,以及无序区最小值的位置。没有排序过的就是无序区
效果:
定义一个列表:[3, 9, 1, 7]
第一次选择排序后,3和1交换:[1,9,3,7],1是有序区,1后面的三位再继续选择交换
第二次:[1,3,9,7]
第三次:[1,3,7,9]
简单的实现:
def select_sort_simpel(li):
# 定义一个空列表
list_new = []
for i in range(len(li)):
# 查找出列表最小的值,放到新列表中,在原列表中删除最小值
min_value = min(li)
list_new.append(min_value)
li.remove(min_value)
return list_new
li = [7, 9, 3, 2, 6]
res = select_sort_simpel(li)
print(res)
# [2, 3, 6, 7, 9]
以上的做法比较容易理解一些,但是新增了一个列表,增加了使用内存,明显不是好的解法
def select_sort(li):
length = len(li)
# i 是一共需要几趟,跟冒泡类似
for i in range(length - 1):
# i 从 0 开始,默认是最小,然后进行比较,所以还需要一个 j
min_index = i
for j in range(i+1, length):
# 第i 个值和后面的值比较,如果大于,交换下标,调换位置
# 如果想把数组排成降序,则把大于号改成小于号
if li[min_index] > li[j]:
min_index = j
# 交换位置
li[min_index], li[i] = li[i], li[min_index]
# 打印每一轮的排序情况
print(f'第{i + 1}轮排序是:{li}')
print(f'最终排好序为:{li}')
if __name__ == '__main__':
li = [3, 8, 9, 1, 5]
print(f'初始数列:{li}')
select_sort(li)
结果:
初始数列:[3, 8, 9, 1, 5]
第1轮排序是:[1, 8, 9, 3, 5]
第2轮排序是:[1, 3, 9, 8, 5]
第3轮排序是:[1, 3, 5, 8, 9]
第4轮排序是:[1, 3, 5, 8, 9]
最终排好序为:[1, 3, 5, 8, 9]
冒泡排序和插入排序区别:
- 冒泡排序与选择排序主要区别在于交换的方式不同,
- 冒泡排序是通过相邻元素的比较进行交换,而选择排序则是通过当前元素与第n个元素的比较进行交换。
冒泡排序优缺点:
优点: 比较简单,空间复杂度较低,是稳定的;
缺点: 时间复杂度太高,效率慢;
选择排序优缺点:
优点: 一轮比较只需要换一次位置;
缺点: 效率慢,不稳定
分类:
python
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2021-12-17 python - 接口自动化 - Requests 调试脚本综合实战
2020-12-17 十三、JMeter实战-关联-正则表达式