冒泡算法排序

冒泡排序

冒泡图片展示

核心算法

排序算法,一般都实现为就地排序,输出为升序

扩大有序区,减小无序区。图中红色部分就是增大的有序区,反之就是减小的无序区

每一趟比较中,将无序区中所有元素依次两两比较,升序排序将大数调整到两数中的右侧

每一趟比较完成,都会把这一趟的最大数推倒当前无序区的最右侧

基本实现

思考时,将问题规模减小,一般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²)
posted @   流走在黑夜深巷的猫  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示