1、冒泡排序算法

一、前言

冒泡排序思想:
相邻的元素两两比较,较大的数下沉,较小的数冒起来,这样一趟比较下来,最大(小)值就会排列在一端。整个过程如同气泡冒起,因此被称作冒泡排序。如下动画所示
冒泡排序

二、原理

算法原理

  • 比较相邻的元素。如果第一个比第二个大,就交换他们两个

三、分析

#给定以下列表使用冒泡排序
a=[11,2,6,4,2,5,10]

在这里插入图片描述
由上图我们可知,相邻元素交换,一共需要N-1躺,每趟指针移动到哪里结束呢?由图可知,第一趟指向索引值为N-2,第二趟指向索引值为N-3…
因此可写如下程序

a=[11,2,6,4,2,5,10]

def bubble_sort(li):
    '''
    #一共循环N-1趟
	#每趟指针指向最后索引为[0,N-i-1)  
	    即i=0时,[0,N-0-1)区间含有N-2个元素,最后索引为N-2
    :param li:
    :return:
    '''
    for i in range(len(li)-1): #一共循环N-1趟
        for j in range(len(li)-i-1):#每趟指针指向最后索引为N-i-1 
            if li[j]>li[j+1]:
                li[j],li[j+1]=li[j+1],li[j]
        print(li)
    print(li)

bubble_sort(a)

运行结果如下:

[2, 6, 4, 2, 5, 10, 11]
[2, 4, 2, 5, 6, 10, 11]
[2, 2, 4, 5, 6, 10, 11]
[2, 2, 4, 5, 6, 10, 11]
[2, 2, 4, 5, 6, 10, 11]
[2, 2, 4, 5, 6, 10, 11]
[2, 2, 4, 5, 6, 10, 11]

四、优化

从结果我们可知,第三趟列表已经排好了,从第四趟往后,列表元素都没发生交换。
因此我们是不是可以这样想:当一趟中,元素都没有发生交换,我们就认为列表此时已经排序完成。
优化如下

a=[11,2,6,4,2,5,10]

def bubble_sort(li):
    '''
    #一共循环N-1趟
	#每趟指针指向最后索引为[0,N-i-1)
	    即i=0时,[0,N-0-1)区间含有N-2个元素,最后索引为N-2
    :param li:
    :return:
    '''
    for i in range(len(li)-1): #一共循环N-1趟
        exchange=False
        for j in range(len(li)-i-1):#每趟指针指向最后索引为N-i-1
            if li[j]>li[j+1]:
                li[j],li[j+1]=li[j+1],li[j]
                exchange=True
        if not exchange: #若一趟后,元素没有交换,则排序完成,直接return
            return li
        print(li)
    print(li)

bubble_sort(a)

最终结果为:

[2, 6, 4, 2, 5, 10, 11]
[2, 4, 2, 5, 6, 10, 11]
[2, 2, 4, 5, 6, 10, 11]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值