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(n²),时间复杂度大的算法会增加计算机运行负荷,效率低下。尽量写出时间复杂度小的算法
'''
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])