排序算法-冒泡排序、选择排序、插入排序、希尔排序、快速排序
冒泡排序
思路:从列表第一个元素开始,相邻两个相比较,如果前者比后者大,则交换,使最大的最终交换到列表末尾。
alist = [3, 5, 2, 4, 1, 9] def bubbleSort(alist): for i in range(0, len(alist) - 1): for j in range(0, len(alist) - i - 1): if alist[j] > alist[j + 1]: alist[j], alist[j + 1] = alist[j + 1], alist[j] return alist ret=bubbleSort(alist) print(ret)
选择排序
思路:设置一个max_index,初始假定列表第一个元素为最大值(即max_index=0),然后依次与max_index下标对应的值比较,如果比max_index对应的值大,则将max_index值改为较大的数对应的索引。
alist = [3, 5, 2, 4, 1, 9] def choiceSort(alist): for i in range(0, len(alist) - 1): max_index = 0 for j in range(1, len(alist) - i): if alist[j] > alist[max_index]: max_index = j alist[len(alist) - 1 - i], alist[max_index] = alist[max_index], alist[len(alist) - 1 - i] return alist ret = choiceSort(alist) print(ret)
插入排序
思路:将列表分为左右两部分,前部分有序,后部分无序,后部分依次取值插入前部分,使之前部分始终有序,直到整个列表全部变为前半部分。
alist = [3, 5, 2, 4, 1, 9] def insertSort(alist): for i in range(1, len(alist)): while i > 0: if alist[i - 1] > alist[i]: alist[i - 1], alist[i] = alist[i], alist[i - 1] i -= 1 else: break return alist ret = insertSort(alist) print(ret)
希尔排序
思路:根据gap分组,组内排序,再改变gap,形成新组,再进行组内插入排序,直到gap=1,再进行一次插入排序。(gap=len(alist)//2 ; gap=gap//2)
alist = [3, 5, 2, 4, 1, 9] def shellSort(alist): gap = len(alist) // 2 while gap >= 1: for i in range(gap, len(alist)): while i > 0: if alist[i - gap] > alist[i]: alist[i - gap], alist[i] = alist[i], alist[i - gap] i -= gap else: break gap = gap // 2 return alist ret = shellSort(alist) print(ret)
快速排序
思路:以组的第一个为基准,列表最左端为low,最右端为high,先判断high对应的值和基准值比较,如果移动high值,则暂停移动high,开始移动low,直到low和high重合,然后将基准值放在重合位置。再对基准值左右两边两个列表进行递归操作,直到最后分得最小单位为一个元素,排序完成。
def sort(alist,start,end): low = start high = end #递归结束的条件 if low > high: return #基准:最左侧的数值 mid = alist[low] #low和high的关系只能是小于,当等于的时候就要填充mid了 while low < high:
# 向左偏移high while low < high: if alist[high] > mid: high -= 1 else: alist[low] = alist[high] break
# 向右偏移low while low < high: if alist[low] < mid: low += 1 else: alist[high] = alist[low] break #当low和high重复的时候,将mid填充 if low == high: alist[low] = mid #or alist[high] = mid break #执行左侧序列 sort(alist,start,high-1) #执行右侧序列 sort(alist,low+1,end) return alist
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~