# python内置有排序的方法sort()
# 冒泡排序
# 生成8个1-20范围内的随机数
import random
numbers=[]
for i in range(8):
ran=random.randint(1,20)
numbers.append(ran)
print(numbers)
# 冒泡排序 最初的样子 不断循环遍历整个数组 把大的数一直往后移动 缺点:进行了多次无效遍历 排序完成了还没退出循环
"""
for i in range(len(numbers)): # range(10) --> 0~9
for j in range(len(numbers)-1):
if numbers[j]>numbers[j+1]: # 前面的数比后面的大
# 交换
temp=numbers[j]
numbers[j]=numbers[j+1] # 把后面的值赋值给前面
numbers[j+1]=temp
print(numbers)
"""
# 冒泡排序 优化1 可以加一个标记 当这一轮没有交换数据时 就退出循环
"""
for i in range(len(numbers)): # range(10) --> 0~9
flag = 0 # 优化:添加了一个标记
for j in range(len(numbers)-1):
if numbers[j]>numbers[j+1]: # 前面的数比后面的大
# 交换
temp=numbers[j]
numbers[j]=numbers[j+1] # 把后面的值赋值给前面
numbers[j+1]=temp
flag=1 # 这一轮有交换数据flag置1
else: # 跳出j循环之后 执行该代码 判断这一轮是否有交换数据
if flag==0: # 没有交换数据
print('跳出循环,此时i=%d' %i)
break
print(numbers)
"""
# 优化1的效率还是太慢,仅仅是循环遍历的轮次进行了优化 让外层i进入的次数变少了 接下来继续优化内层的j
# 优化一仅仅适用于连片有序而整体无序的数据
# 冒泡排序 再优化 优化2
"""
for i in range(len(numbers)): # range(10) --> 0~9
flag = 0 # 添加了一个标记
for j in range(len(numbers)-1-i): #优化1:每次进行移动的时候总是把较大的数移动到最后 所以这里-i
if numbers[j]>numbers[j+1]: # 前面的数比后面的大
# 交换
temp=numbers[j]
numbers[j]=numbers[j+1] # 把后面的值赋值给前面
numbers[j+1]=temp
flag=1 # 这一轮有交换数据flag置1
else: # 跳出j循环之后 执行该代码 判断这一轮是否有交换数据
if flag==0: # 没有交换数据
print('跳出循环,此时i=%d' %i)
break
print(numbers)
"""
# 冒泡排序 再优化 优化3 : 有可能倒数的多个值都是有序的了,所以我们去找其最后一次进行交换数据的索引j,存储再pos中
"""
for i in range(len(numbers)): # range(10) --> 0~9
flag = 0 # 添加了一个标记
pos = len(numbers)-1-i
for j in range(pos):
if numbers[j]>numbers[j+1]: # 前面的数比后面的大
# 交换
temp=numbers[j]
numbers[j]=numbers[j+1] # 把后面的值赋值给前面
numbers[j+1]=temp
pos=j
flag=1 # 这一轮有交换数据flag置1
else: # 跳出j循环之后 执行该代码 判断这一轮是否有交换数据
if flag==0: # 没有交换数据
print('跳出循环,此时i=%d' %i)
break
print(numbers)
"""
# 冒泡排序 再优化4 正向排最大值最后,反向排最小值最前(效率最高)
for i in range(len(numbers)): # range(10) --> 0~9
flag = 0 # 添加了一个标记
pos = len(numbers)-1-i #优化1
for j in range(pos):
if numbers[j]>numbers[j+1]: # 前面的数比后面的大
# 交换
temp=numbers[j]
numbers[j]=numbers[j+1] # 把后面的值赋值给前面
numbers[j+1]=temp
pos=j # 优化2:得到较小数的索引
flag=1 # 这一轮有交换数据flag置1
for j in range(pos,1,-1): # 把较小的数 移动至前面
if numbers[j] < numbers[j-1]: # 后面的数比前面的小
# 交换
temp=numbers[j-1]
numbers[j-1]=numbers[j] # 把后面的值赋值给前面
numbers[j]=temp
else: # 跳出j循环之后 执行该代码 判断这一轮是否有交换数据
if flag==0: # 没有交换数据
print('跳出循环,此时i=%d' %i)
break
print(numbers)
#Python 冒泡排序 多次优化 详细解析
最新推荐文章于 2024-08-20 13:04:52 发布