冒泡排序的优化
原本的 冒泡排序 会有一种可能,就是在某次排序结束后,整个数组已经完成了排序,但是还要将后续的循环执行结束,造成浪费。
所以需要针对外层循环优化 优化思路如下:
设置一个标志,当循环时发现元素之间已经不存在交换,那么后续大循环将不再执行。
代码如下
# 示例
arr = [0,4,5,8,6,3,9,2,1,7]
# 交换值
def swap(j):
arr[j] = arr[j] ^ arr[j+1]
arr[j+1] = arr[j] ^ arr[j + 1]
arr[j] = arr[j] ^ arr[j + 1]
# 冒泡排序改进
def bubbingOpt():
for i in range(1,len(arr),1):
# print (i) #这里打印第几轮循环
isLoop = True
for j in range(0,len(arr) - i,1):
if arr[j] > arr[j+1]:
swap(j)
isLoop = False
# str = "| i = %d j = %d , %s" % (i, j,arr)
# print(str) 这里显示元素交换过程
if isLoop:
print ('已经发现元素之间不交环结束循环体')
break
# bubbingOpt()
针对外层循环的改进如上所示,那么我们发现 内层循环的规律:
每次小循环内,最后一次交换的位置元素之后的顺序都是排列整齐的
那么内层循环优化方向如下:
通过标识位减少内层循环的顺序
代码如下
# 示例
arr = [0,4,5,8,6,3,9,2,1,7]
# 交换值
def swap(j):
arr[j] = arr[j] ^ arr[j+1]
arr[j+1] = arr[j] ^ arr[j + 1]
arr[j] = arr[j] ^ arr[j + 1]
# 冒泡排序改进2
def bubbingOpt2():
size = len(arr) - 1 #默认为数组长度
isLoop = True
for i in range(1,len(arr),1):
tang += 1
flag = 0 # 标识位 flag变量用来标记循环里最后一次交换的位置
for j in range(0,size,1):
ci += 1
if arr[j] > arr[j+1]:
swap(j)
isLoop = False
flag = j + 1 #只要交换就将交换后的位置记录
size = flag #将最后一个交换值的位置设置为内循环边界
if isLoop:
print ('已经发现元素之间不交环结束循环体')
break
bubbingOpt2()