排序算法-LowB三人组(冒泡,选择,插入)
冒泡排序
时间复杂度:O(n2)
- 列表每相邻的数,如果前比后大,则交换两个数
- 一趟排序完成后,则无序区减少一个数,有序区增加一个数
- 代码关键点:躺,无序区范围
1 2 3 4 5 6 7 | #升序 def bubble_sort(li): for i in range ( len (li) - 1 ): #多少躺 for j in range ( len (li) - i - 1 ): #下标指针 if li[j] > li[j + 1 ]: li[j],li[j + 1 ] = li[j + 1 ],li[j] print (li) #打印每躺调试 |
1 2 3 4 5 6 7 | #降序 def bubble_sort(li): for i in range ( len (li) - 1 ): #多少躺 for j in range ( len (li) - i - 1 ): #下标指针 if li[j] < li[j + 1 ]: li[j],li[j + 1 ] = li[j + 1 ],li[j] print (li) #打印每躺调试 |
1 2 3 4 5 6 7 8 9 10 | #改进 def bubble_sort(li): for i in range ( len (li) - 1 ): exchange = False for j in range ( len (li) - i - 1 ): if li[j] > li[j + 1 ]: li[j],li[j + 1 ] = li[j + 1 ],li[j] exchange = True if not exchange: return |
优点:原地排序,即不生成新列表,在原列表基础上进行交互,对内存友好
选择排序
时间复杂度:O(n2)
- 一趟排序记录最小的数,放到第一个位置
- 再一趟排序记录列表无序区最小的数,放到第二个位置
- ...以此类推
- 算法关键点:有序区和无序区,无序区最小数的位置
1 2 3 4 5 6 7 8 | #粗暴的按思路实现 def select_sort_simple(li): list_new = [] for i in range ( len (li)): min_val = min (li) list_new.append(min_val) li.remove(min_val) return list_new |
缺点:需要新增一个列表list_new耗内存,min本身就是O(n)时间复杂度,remove同样也是O(n),总时间复杂度=O(n)套上两个O(n)约等于O(n2)
1 2 3 4 5 6 7 8 | #常规选择排序 def select_sort(li): for i in range ( len (li) - 1 ): #i是第几趟 min_loc = i for j in range (i + 1 , len (li)): #j是无序区 if li[j] < li[min_loc]: min_loc = j #找出无序区最小值下标 li[i],li[min_loc] = li[min_loc],li[i] |
插入排序
时间复杂度:O(n2)
- 初始时手里(有序区)只有一张牌
- 每次(从无序区)模一张牌,插入到手里已有牌的正确位置
1 2 3 4 5 6 7 8 | def insert_sort(li): for i in range ( 1 , len (li)): #i表示摸到牌的下标 tmp = li[i] j = i - 1 #j指的是手里的牌下标 while j > = 0 and li[j] > tmp: li[j + 1 ] = li[j] j = j - 1 li[j + 1 ] = tmp |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!