栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

经典排序算法——冒泡排序及其优化(python代码实现)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

经典排序算法——冒泡排序及其优化(python代码实现)

冒泡排序

        冒泡排序是排序算法中非常经典的一种交换排序算法,思想比较简单,容易理解和实现,一般是初学者最早接触的一种排序算法。

        之所以称之为冒泡排序,就是因为在排序的过程中,像汽水冒泡一样,元素会逐渐一步一步的上浮到最顶端(最后)。

基本思想

        通过一趟趟地比较,每一趟确定一个剩余待排元素中的最大或最小元素,直到所有元素有序。具体来说,在每一趟排序中,元素两两比较,从起始位置开始,当前元素与后一个元素比较,若这两个元素符合有序,则忽略并后移一个元素继续向后比较,若不符合则先交换元素,然后后移一个元素继续向后比较,直到本趟结束。

性能特点

平均时间复杂度最好情况最坏情况空间复杂度排序方式稳定性
In-place稳定
步骤详解

待排数列:

14265876346564

升序排序 

第一趟排序:

14265876346564
14265876346564
14265876346564
14265348766564
14265346568764
14265346564876

第二趟排序:

14265346564876
14265346564876
14234656564876
14234656564876
14234654656876

第三趟排序:

14234654656876
13442654656876
13442654656876
13442465656876

第四趟排序:

13442465656876
13442465656876
13444265656876

第五趟排序:

13444265656876
14344265656876

第六趟排序:

     

14344265656876

 有序数列:

14344265656876
优化

        其实,冒泡排序算法还可以做进一步的优化使其效率更高,下面我们来举一个比较极端的例子。

        现在存在一个待排序序列,其已经是一个有序的序列,如下:

那么此时我们的冒泡排序算法将会进行如下排序操作操作:

        我们可以很清晰的看出,当我们的待排序列已经是有序的时候,冒泡排序算法还是会进行一定的无用功操作,这样就降低了算法的效率,因此可以对基本的冒泡排序进行一定的改进:

 

        我们设置一个标志位来记录,如果我们进行一趟排序操作没有进行任何元素交换,那么就说明待排序列已经是有序的了,因此我们就可以提前结束排序操作。


python代码

# 冒泡排序
def bubbleSort(arr):
    for i in range(1, len(arr)):
        for j in range(0, len(arr)-i): # 每排序一趟就少一个元素需要进行比较(后面的元素已经有序)
            #if arr[j] > arr[j + 1]:  # 升序
            if arr[j] < arr[j + 1]:   # 降序
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
    return arr


if __name__=="__main__":
    nums = [1, 42, 65, 876, 34, 656, 4, 6757, 89, 24, 65, 42]
    print("start:", nums)
    print("冒泡 :", bubbleSort(nums))

优化 python代码

# 冒泡排序
def bubbleSort(arr):
    for i in range(1, len(arr)):
        flag = False  # 设置标志位,判断当前趟次是否有元素交换
        for j in range(0, len(arr)-i): # 每排序一趟就少一个元素需要进行比较(后面的元素已经有序)
            #if arr[j] > arr[j + 1]:  # 升序
            if arr[j] < arr[j + 1]:   # 降序
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
                flag = True  # 记录发生了交换
        if flag==False: # 如果元素未发生交换,说明待排序列已经是有序序列,则提前结束排序
            break
    return arr


if __name__=="__main__":
    nums = [1, 42, 65, 876, 34, 656, 4, 6757, 89, 24, 65, 42]
    print("start:", nums)
    print("冒泡 :", bubbleSort(nums))

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/950115.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号