排序算法-冒泡排序

一、冒泡排序

一种简单的排序算法,它重复地遍历待排序的数列,比较相邻的两个元素并按照升序或降序交换它们的位置,从而将最大或最小的元素逐渐"浮"到数组的顶端或底端。

按照冒泡排序的思想,我们要把相邻的元素两两比较,当一个元素大于右侧相邻元素时,交换它们的位置;当一个元素小于或等于右侧相邻元素时,位置不变。过程如下:

冒泡排序是一种稳定排序,值相等的元素并不会打乱原本的顺序。由于该排序算法的每一轮都要遍历所有元素,有n个数,总共遍历(n-1)轮,所以平均时间复杂度是O (n2)。

(1) 基本-冒泡排序

python 复制代码
def bubbleSort(ll):
    #外层循环(轮数)
    for i in range(len(ll)-1):
        #内层循环(次数)
        for j in range(len(ll)-i-1):
            #判断两两比较
            if ll[j]>ll[j+1]:
                #第一个>第二个,则交换
                 ll[j],ll[j + 1] = ll[j + 1],ll[j]


if __name__ == '__main__':
    ll=[5,8,6,3,9,2,1,7]
    print('排序前:')
    print(ll)
    bubbleSort(ll)
    print('排序后:')
    print(ll)

当排序算法分别执行到第6轮、第7轮时,数列状态如下:

很明显,经过第6轮排序后,整个数列已经是有序了,可是排序算法仍然兢兢业业地继续执行了第7轮排序。

(2) 优化-冒泡排序

python 复制代码
def bubbleSort2(ll):
    #外层循环(轮数)
    for i in range(len(ll)-1):
        #标识:有序
        flag=True
        #内层循环(次数)
        for j in range(len(ll)-i-1):
            #判断两两比较
            if ll[j]>ll[j+1]:
                #第一个>第二个,则交换
                ll[j],ll[j + 1] = ll[j + 1],ll[j]
                #还是无序,进行比较交换
                flag=False
        #数列有序,就直接退出循环
        if flag:
            break

(3) 优化-双向冒泡排序

python 复制代码
def bubbleSort3(ll):
    #外层循环(轮数)
    for i in range(len(ll)//2):
        #标识:有序
        flag=True
        # 奇数轮,从左向右比较和交换
        #内层循环(次数)
        for j in range(i,len(ll)-i-1):
            #判断两两比较
            if ll[j]>ll[j+1]:
                #第一个>第二个,则交换
                ll[j],ll[j + 1] = ll[j + 1],ll[j]
                #还是无序,进行比较交换
                flag=False
        #数列有序,就直接退出循环
        if flag:
            break

        # 偶数轮之前,重新标记为true
        # 标识:有序
        flag = True
        # 偶数轮,从右向左比较和交换
        # 内层循环(次数)
        for j in range(len(ll) - i - 1,i,-1):
            # 判断两两比较
            if ll[j] < ll[j - 1]:
                # 第一个>第二个,则交换
                ll[j], ll[j -1] = ll[j - 1], ll[j]
                # 还是无序,进行比较交换
                flag = False
        # 数列有序,就直接退出循环
        if flag:
            break

很明显,这个排序的优点是能够在特定条件下,减少排序的回合数;而缺点也很明显,就是代码量几乎增加了1倍。

相关推荐
飞机和胖和黄44 分钟前
考研之王道C语言第三周
c语言·数据结构·考研
yyy(十一月限定版)1 小时前
寒假集训4——二分排序
算法
星火开发设计1 小时前
类型别名 typedef:让复杂类型更简洁
开发语言·c++·学习·算法·函数·知识
醉颜凉1 小时前
【LeetCode】打家劫舍III
c语言·算法·leetcode·树 深度优先搜索·动态规划 二叉树
达文汐1 小时前
【困难】力扣算法题解析LeetCode332:重新安排行程
java·数据结构·经验分享·算法·leetcode·力扣
一匹电信狗1 小时前
【LeetCode_21】合并两个有序链表
c语言·开发语言·数据结构·c++·算法·leetcode·stl
User_芊芊君子1 小时前
【LeetCode经典题解】搞定二叉树最近公共祖先:递归法+栈存路径法,附代码实现
算法·leetcode·职场和发展
算法_小学生1 小时前
LeetCode 热题 100(分享最简单易懂的Python代码!)
python·算法·leetcode
执着2591 小时前
力扣hot100 - 234、回文链表
算法·leetcode·链表
Gorgous—l1 小时前
数据结构算法学习:LeetCode热题100-多维动态规划篇(不同路径、最小路径和、最长回文子串、最长公共子序列、编辑距离)
数据结构·学习·算法