数据结构算法--排序--冒泡排序

冒泡排序是交换排序的一种,所以需要两两比较,在满足判定条件的情况下,进行交换操作;

动图解释

  算法分析

假设数组中有N 个数字需要排序;

1. 需要N-1轮排序【最后两个一次排序就可确定】,如果不设置 没轮里面,比较的次数,那么需要N-1词的,设置的话就是N-i次

2. 冒泡排序中, 每进行一次排序,总是会把最大量找出来,放在最后一个位置;

例:第一趟比较之后,排在最后的一个数一定是最大的一个数,第二趟排序的时候,只需要比较除了最后一个数以外的其他的数,同样也能找出一个最大的数排在参与第二趟比较的数后面,第三趟比较的时候,只需要比较除了最后两个数以外的其他的数,以此类推……也就是说,没进行一趟比较,每一趟少比较一次,一定程度上减少了算法的量。

3. 时间复杂度

1.如果我们的数据正序,只需要走一趟即可完成排序【需要设置一个flag方可实现】。所需的比较次数C和记录移动次数M均达到最小值,

即:Cmin=n-1;Mmin=0;所以,冒泡排序最好的时间复杂度为O(n)。

2.如果很不幸我们的数据是反序的,则需要进行n-1趟排序。每趟排序要进行n-i次比较(1≤i≤n-1),且每次比

较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:

 

综上所述:冒泡排序总的平均时间复杂度为:O(n2) ,时间复杂度和数据状况无关。

3. 代码实现

d0 = [1, 2, 3, 4, 5, 6, 7]
d0_out = [2, 2, 2, 3, 4, 4, 4, 4, 5, 5, 5, 6, 6, 7, 9, 12, 15, 44, 45, 54, 64]  # 正确排序


# 最原始的冒泡排序
class BubbleSort():

    def solution1(self, array):
        if array is None or len(array) == 0:
            return
        count = 0
        n = len(array)
        for _ in range(n-1):
            max_index = n - 1
            for i in range(n-1):
                if array[i] > array[i+1]:
                    array[i], array[i+1] = array[i+1], array[i]
                    count += 1
            max_index -= 1

        print('array length {}, exchange numbers {}'.format(n, count))
        return array

    def solution2(self, array):

        if array is None or len(array) == 0:
            return

        n = len(array)
        count = 0
        for _ in range(n-1):
            max_index = n - 1
            exchange_flag = False
            for j in range(max_index):
                if array[j] > array[j+1]:
                    array[j], array[j+1] = array[j+1], array[j]
                    count += 1
                    exchange_flag = True
            if not exchange_flag:
                break

        print('array length {}, exchange numbers {}'.format(n, count))
        return array


bubble = BubbleSort()
print(bubble.solution1(d0))

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值