冒泡算法排序
冒泡排序
冒泡图片展示
核心算法
排序算法,一般都实现为就地排序,输出为升序
扩大有序区,减小无序区。图中红色部分就是增大的有序区,反之就是减小的无序区
每一趟比较中,将无序区中所有元素依次两两比较,升序排序将大数调整到两数中的右侧
每一趟比较完成,都会把这一趟的最大数推倒当前无序区的最右侧
基本实现
思考时,将问题规模减小,一般2次不一定能找到规律,3次基本上可以看出规律。所以,我们思考时认为列表里面就只有4个元素。
以num[9,1,8,5]为例推冒泡排序写法
第一趟
☆☆☆冒泡排序代码
def bubblingsort(list):
length = len(list)
for i in range(length-1):
for j in range(length-1-i):
if list[j] > list[j+1]:
temp = list[j]
list[j] = list[j+1]
list[j+1] = temp
return list
☆☆☆思考:
上面冒泡排序,排好序都是需要跑len(list)-1趟,假如给的数后面序列是排好的亦或者是给定的就是排好序的,每趟都要跑,是不是有点臃肿,能优化吗?
能让它在知道后面已经排好序了提前中断排序吗?假如某一趟两两比较后没有发生任何交换,说明什么?
能优化,我们可以在知道后面已经是排好序的情况下中断结束冒泡排序,如何判断已经排好序了?其实就是上面思考的,假如某一趟两两不交换了,就说
明序列已经排好了,此时我们就打个标记表明排好序了,然后判断标记就可以把冒泡排序结束了
我们就拿几个数字的来进行演练好思考
num = [9,2,3,5,6]
length = len(num)
count = 0 #比较次数
swap = 0 # 交换次数
for i in range(length-1): # 需要跑趟数 length-1趟
flag = False # 标记每趟完全没有交换的
for j in range(length-1-i): # 每趟需要交换的次数 length-1 -(趟数-1) 趟数-1就是i
count +=1
if num[j]>num[j+1]:
temp = num[j]
num[j] = num[j+1]
num[j+1] = temp
swap +=1
flag = True
if not flag:
break
print(num,count,swap)
# 封装一下
def bubblingsort(list):
length = len(list)
count = 0 # 比较次数
swap = 0 # 交换次数
for i in range(length - 1): # 需要跑趟数 length-1趟
flag = False # 标记每趟完全没有交换的
for j in range(length - 1 - i): # 每趟需要交换的次数 length-1 -(趟数-1) 趟数-1就是i
count += 1
if list[j] > list[j + 1]:
temp = list[j]
list[j] = list[j + 1]
list[j + 1] = temp
swap += 1
flag = True
if not flag:
break
return list
总结
·冒泡法需要数据一趟趟比较
·可以设定一个标记判断此轮是否有数据交换发生,如果没有发生交换,可以结束排序,如果发生交换,继续下一轮排序
·最差的排序情况是,初始顺序与目标顺序完全相反,遍历次数1,...,n—1之和n(n—1)/2
·最好的排序情况是,初始顺序与目标顺序完全相同,遍历次数n—1
·时间复杂度O(n²)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理