zoukankan      html  css  js  c++  java
  • Python中的排序---冒泡法

    冒泡排序(英语:Bubble Sort)是一种简单的排序算法。此算法依次比较序列的两个元素的大小,如果元素的顺序错误,就交换其位置,直到序列的元素变得有序才停止遍历。

    时间复杂度O(n²)

    交换过程如下图:

    图片来源:https://blog.csdn.net/u014745194

    代码1

    升序

    lst=[ [1,9,8,5,6,7,4,3,2], [1,2,3,4,5,6,7,8,9] ] 
    lst1=lst[0]
    print(lst1)
    length=len(lst1)
    for i in range(length):                      ## 控制循环的次数,因为每一个数都需要做一次循环比较
        for j in range(length-i-1):              ## 因为是两两比较,所以要少一次遍历
            if lst1[j] > lst1[j+1]:              ## 以下代码逻辑,当索引j对应的值比j+1对应的值大时,将较大值j赋值给临时变量tmp,由于索引j+1的值小,所以向前移动,将其值赋值给索引j,临时变量(索引j)的值需要依次向后比较
                tmp=lst1[j]
                lst1[j]=lst1[j+1]
                lst1[j+1]=tmp
    print(lst1)

    统计交换次数和循环次数

    lst = [[1, 9, 8, 5, 6, 7, 4, 3, 2], [1, 2, 3, 4, 5, 6, 7, 8, 9]]
    lst1 = lst[0]
    print(lst1)
    
    count = 0
    count_swap = 0
    length = len(lst1)
    for i in range(length):
        for j in range(length - i - 1):
            count += 1       ## 统计循环次数
            if lst1[j] > lst1[j + 1]:
                tmp = lst1[j]
                lst1[j] = lst1[j + 1]
                lst1[j + 1] = tmp
                count_swap += 1    ## 统计交换次数
    print(lst1, count, count_swap)

    运行结果

    [1, 9, 8, 5, 6, 7, 4, 3, 2]
    [1, 2, 3, 4, 5, 6, 7, 8, 9] 36 25

    上面例子中特殊的情况(默认已经排序好)

    方法1(每一次都比较)

    lst=[ [1,9,8,5,6,7,4,3,2], [1,2,3,4,5,6,7,8,9] ]
    lst1=lst[1]
    print(lst1)
    
    count=0
    count_swap=0
    length=len(lst1)
    for i in range(length):
        for j in range(length-i-1):
            count+=1
            if lst1[j] > lst1[j+1]:
                tmp=lst1[j]
                lst1[j]=lst1[j+1]
                lst1[j+1]=tmp
                count_swap+=1
    print(lst1,count,count_swap)

    运行结果:循环了36次

    [1, 2, 3, 4, 5, 6, 7, 8, 9]
    [1, 2, 3, 4, 5, 6, 7, 8, 9] 36 0

    代码优化

    定义一个开关变量,当本次循环进来,发现根本不需要交换的时候,改变开关变量的值,直接进入下一次循环

    lst = [[1, 9, 8, 5, 6, 7, 4, 3, 2], [1, 1, 1, 1, 1, 1, 1, 1, 1]]
    lst1 = lst[1]
    print(lst1)
    count = 0
    count_swap = 0
    length = len(lst1)
    for i in range(length):
        flag = False
        for j in range(length - i - 1):
            count += 1
            if lst1[j] > lst1[j + 1]:
                tmp = lst1[j]
                lst1[j] = lst1[j + 1]
                lst1[j + 1] = tmp
                count_swap += 1
                flag = True
        if not flag:
            break
    print(lst1, count, count_swap)

    运行结果

    [1, 1, 1, 1, 1, 1, 1, 1, 1]
    [1, 1, 1, 1, 1, 1, 1, 1, 1] 8 0
  • 相关阅读:
    Linux下Redis集群环境的搭建
    redis: 6379端口下set值时出现 CLUSTERDOWN The cluster is down
    运行Maven工程总是报错:No goals have been specified for this build
    Centos6.5 配置Nginx开机自启动
    centos6.5无法访问网络
    centos6.5 nginx-1.8.0和ftp搭建图片服务器
    HTML中使图片居中显示
    使用InstallAnywhere工具打包Java_Web程序
    Android开发中Parcelable接口的使用方法
    Java8并行流使用注意事项
  • 原文地址:https://www.cnblogs.com/zh-dream/p/13396549.html
Copyright © 2011-2022 走看看