python3实现数据结构与算法30天-排序-选择排序(5)
算法思路:
每次选出最小的,放入第一个位置,
再一趟排序记录列表无序区最小的数,放第二个位置
算法关键点:有序区和无序区,无序区最小的数
时间复杂度:O(n^2)
1.简单版-代码:
import def select_sort_simple(lst): """create new list, callback min & remove""" lst_new = [] for i in range(len(lst)): min_loc = min(lst) lst_new.append(min_loc) lst.remove(min_loc) print(lst_new) return lst_new lst = [random.randint(0, 100) for x in range(10)] print(lst) print(select_sort_simple(lst))
结果:
[33, 67, 92, 15, 39, 23, 10, 53, 95, 25] [10] [10, 15] [10, 15, 23] [10, 15, 23, 25] [10, 15, 23, 25, 33] [10, 15, 23, 25, 33, 39] [10, 15, 23, 25, 33, 39, 53] [10, 15, 23, 25, 33, 39, 53, 67] [10, 15, 23, 25, 33, 39, 53, 67, 92] [10, 15, 23, 25, 33, 39, 53, 67, 92, 95] [10, 15, 23, 25, 33, 39, 53, 67, 92, 95]
上面方法可以说是选择排序的简单实现,但存在几个问题,min(),remove()其实也是O(n)级别,而且开辟新的列表,消耗内存,如果序列很大,内存资源消耗大,不建议用。
下面的相当于升级版,改善之处在于,不用开辟新的序列,另外做到能抠则抠,尽量减少不必要的循环,选择排序推荐使用。
2.升级版-代码:
import random def select_srot(lst): for i in range(len(lst)-1): # i是第几趟 min_loc = i for j in range(i+1, len(lst)): # j是无序区, 从i+1开始 if lst[min_loc] > lst[j]: min_loc = j lst[i], lst[min_loc] = lst[min_loc], lst[i] print(lst) lst = [random.randint(0, 100) for x in range(10)] print(lst) print(select_srot(lst))
结果:
[3, 22, 92, 84, 97, 52, 27, 39, 1, 63] [1, 22, 92, 84, 97, 52, 27, 39, 3, 63] [1, 3, 92, 84, 97, 52, 27, 39, 22, 63] [1, 3, 22, 84, 97, 52, 27, 39, 92, 63] [1, 3, 22, 27, 97, 52, 84, 39, 92, 63] [1, 3, 22, 27, 39, 52, 84, 97, 92, 63] [1, 3, 22, 27, 39, 52, 84, 97, 92, 63] [1, 3, 22, 27, 39, 52, 63, 97, 92, 84] [1, 3, 22, 27, 39, 52, 63, 84, 92, 97] [1, 3, 22, 27, 39, 52, 63, 84, 92, 97]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!