概念
步骤
1、比较相邻的元素。如果第一个比第二个大(小),就交换他们两个。
2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大(小)的数。
3、针对所有的元素重复以上的步骤,除了最后已经选出的元素(有序)。
4、持续每次对越来越少的元素(无序元素)重复上面的步骤,直到没有任何一对数字需要比较,则序列最终有序。
原理
冒泡排序的原理(以递增序为例)是每次从头开始依次比较相邻的两个元素,如果后面一个元素比前一个要大,说明顺序不对,则将它们交换,本次循环完毕之后再次从头开始扫描,直到某次扫描中没有元素交换,说明每个元素都不比它后面的元素大,至此排序完成。
可视化图
代码
不可视化
import numpy as np
def Bubble_Sort(value):
for i in range(len(value)-1):
for j in range(len(value)-1):
if value[j] > value[j+1]:
value[j],value[j+1] = value[j+1],value[j]
print('冒泡排序:',end = ' ')
print(value)
if __name__ =='__main__':
list =np.random.randint(200, size=10)
print('随机列表:',end = '')
print(list)
Bubble_Sort(list)
可视化
import turtle
#导入turtle库
import time
#导入time库
import random
#导入random库
pen = turtle.Pen()
#使用pen代替turtle因为后面要设置turtle的画布会冲突所以用pen代替
def block(pen, higth):
#创建方法长方型导入数值长方形的高,和代替turtle的pen
pen.fillcolor(random.random(), random.random(), random.random())
#设置填充颜色(随即颜色
pen.begin_fill()
#开始启用画笔
pen.left(90)
#左转90度
pen.forward(higth * 10)
#前进higth * 10
pen.write(higth)
#写出数字
pen.right(90)
#右转90度
pen.forward(50)
#前进50像素
pen.right(90)
#右转90度
pen.forward(higth * 10)
#前进higth * 10
pen.right(90)
#右转90度
pen.forward(50)
#前进50像素
pen.end_fill()
# 抬笔
pen.right(180)
#右转180度
def bubble(li):
#创造方法冒泡排序,创造函数li(需整理的数组)
for i in range(len(li) - 1):
#重复执行的次数为li中数字的-1
for j in range(len(li) - 1 - i):
#li-1去做比较-i的意义(减少排序好的元素)
pen[j].showturtle()
#现实图形
pen[j + 1].showturtle()
#显示下面一个图形
time.sleep(2)
#休眠两妙
pen[j].hideturtle()
#隐藏画笔
pen[j + 1].hideturtle()
#隐藏相印图形
if li[j] > li[j + 1]:
#如果前面的大于后面的
temp = li[j]
#改变数组
li[j] = li[j + 1]
#审核前面的大于后面的
li[j + 1] = temp
#把这这个设置为数组
pen[j].clear()
#移到前面那个图形
pen[j + 1].clear()
#移到前面那个图形
block(pen[j], li[j])
#执行block
block(pen[j + 1], li[j + 1])
#执行block
li = [5, 2, 3, 7, 9, 1, 6]
#li(需整理的数组)
pen = list()
#设置pen代替turtle
n = 0
#设为0
for i in li:
#重复执行数组
n += 1
#n+1
tem = turtle.Turtle()
#设置背景
pen.append(tem)
#背景为默认
tem.hideturtle()
#隐藏画笔
tem.penup()
#抬笔
tem.goto(50 * n, 0)
#移动到合适的地点
for i in range(len(li)):
#重复执行数组
block(pen[i], li[i])
#执行block
bubble(li)
#执行bubble调用函数li