1.冒泡排序

1 、冒泡排序
冒泡排序是排序算法中较为简单的一种,英文称为Bubble Sort。它遍历所有的数据,每次对相邻元素进行两两比较,如果顺序和预先规定的顺序不一致,则进行位置交换;这样一次遍历会将最大或最小的数据上浮到顶端,之后再重复同样的操作,直到所有的数据有序。
2、算法步骤
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
**3.**如果有n个数据,那么需要 O ( n 2 ) O(n^{2}) O(n2)的比较次数,所以当数据量很大时,冒泡算法的效率并不高。
当输入的数据是反序时,花的时间最长,当输入的数据是正序时,时间最短。

平均时间复杂度: O ( n 2 ) O(n^{2}) O(n2)

空间复杂度: O ( 1 ) O(1) O(1)

代码:

# # def bubbleSort(arr):
# #     for i in range(1, len(arr)):
# #         for j in range(0, len(arr)-i):
# #             if arr[j] > arr[j+1]:
# #                 arr[j], arr[j + 1] = arr[j + 1], arr[j]
# #     return arr

实现冒泡法排序时要考虑时间复杂度和空间复杂度是靠近O(1) ,还是接近O(n),甚至是O(n²),时间复杂度大的算法会增加计算机运行负荷,效率低下。尽量写出时间复杂度小的算法

用一个 flag 参数记录新一轮的排序中元素是否做过交换,如果没有,说明前面参与比较过的元素已经是正序,那就没必要再从头比较了
改进代码

def bubbleSort(arr):
    n = len(arr)
    # 遍历所有数组元素
    for i in range(0, n):
        flag = True
        # Last i elements are already in place
        for j in range(0, n - i - 1):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
                flag = False
        if flag:  # 如果假设成立,则结束交换
            break

实验代码:

# '''
# 1.冒泡排序
# '''
# # def bubbleSort(arr):
# #     for i in range(1, len(arr)):
# #         for j in range(0, len(arr)-i):
# #             if arr[j] > arr[j+1]:
# #                 arr[j], arr[j + 1] = arr[j + 1], arr[j]
# #     return arr
# ########################实例输入##########################
# def bubbleSort(arr):
#     n = len(arr)
#     # 遍历所有数组元素
#     for i in range(0, n): 
#         for j in range(0, n - i - 1):
#             if arr[j] > arr[j + 1]:
#                 arr[j], arr[j + 1] = arr[j + 1], arr[j]
#
# #num = [64, 34, 25, 12, 22, 11, 90]
#
# ####输入不定长数组######
# arr = input('')    #输入一个一维数组,每个数之间使空格隔开
# num = [int(n) for n in arr.split(' ')]   #将输入每个数以空格键隔开做成数组
# #print(num)        #打印数组
#
# bubbleSort(num)
# print("排序后的数组:")
# for i in range(len(num)):
#     print("%d" %num[i])


'''
优化后的冒泡算法
实现冒泡法排序时要考虑时间复杂度和空间复杂度是靠近O(1) ,还是接近O(n),甚至是O(),时间复杂度大的算法会增加计算机运行负荷,效率低下。尽量写出时间复杂度小的算法
'''

def bubbleSort(arr):
    n = len(arr)
    # 遍历所有数组元素
    for i in range(n):
        flag = True
        # Last i elements are already in place
        for j in range(0, n - i - 1):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
                flag = False
        i += 1
        #print(i)
        #print("共循环%d次" % i)
        if flag:  # 如果假设成立,则结束交换
            break
    print("共循环%d次" % i)
#num = [64, 34, 25, 12, 22, 11, 90]

####输入不定长数组######
arr = input('')    #输入一个一维数组,每个数之间使空格隔开
num = [int(n) for n in arr.split(' ')]   #将输入每个数以空格键隔开做成数组
#print(num)        #打印数组

bubbleSort(num)
print("排序后的数组:")
for i in range(len(num)):
    print("%d" %num[i])
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值