Turtle实现可视化冒泡算法

利用python的turtle库实现图像化冒泡算法

这是选修课老师留下的一个作业,使用turtle绘制一幅画面

关于turtle库,选修课课上并没有讲到太多,所以更多的是我根据官方文档和自己的理解来进行代码实现

官方文档:https://docs.python.org/zh-cn/3/library/turtle.html#

逻辑过程:

  1. 绘制初始列表的柱状图
  2. 进行冒泡排序,当正在比较的两个数字需要交换位置时,清除掉原有柱形,
  3. 绘制新的图形

我在官方文档中并没有找到清除局部图像的函数,使用多个turtle对象每一个柱状图由一个turtle控制,即可实现单独重绘图形

代码实现:

将多个turtle对象封装到list中,方便之后进行操作

pen=list()
n=0              
for i in li:
    n+=1
    tem=turtle.Turtle()
    pen.append(tem)
    tem.hideturtle()
    tem.penup()
    #使每个画笔起始点不同
    tem.goto(50*n,0)

实现绘制柱形,冒泡算法的函数

def block(pen,higth):
    pen.fillcolor(random.random(),random.random(),random.random())
    pen.begin_fill()
    pen.left(90)
    pen.forward(higth*10)
    pen.write(higth)
    pen.right(90)
    pen.forward(50)
    pen.right(90)
    pen.forward(higth*10)
    pen.right(90)
    pen.forward(50)
    pen.end_fill()
    pen.right(180)
    
def bubble(li):
    for i in range(len(li)-1):
        for j in range(len(li)-1-i):
            #显示小海龟,展示当前对比的元素,停顿2s后隐藏
            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(pen[j+1],li[j+1])

之后需要初始化图形,执行bubble函数即可

完整代码如下

import turtle
import time
import random

#根据数值画柱状图
def block(pen,higth):
    pen.fillcolor(random.random(),random.random(),random.random())
    pen.begin_fill()
    pen.left(90)
    pen.forward(higth*10)
    pen.write(higth)
    pen.right(90)
    pen.forward(50)
    pen.right(90)
    pen.forward(higth*10)
    pen.right(90)
    pen.forward(50)
    pen.end_fill()
    pen.right(180)
    
#冒泡算法
def bubble(li):
    for i in range(len(li)-1):
        for j in range(len(li)-1-i):
            #显示小海龟,展示当前对比的元素,停顿2s后隐藏
            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(pen[j+1],li[j+1])
#需要进行排序的列表                
li=[5,2,3,7,9,1,6]
pen=list()
n=0              
#将画笔对象装到pen中
for i in li:
    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])                

bubble(li)

运行示例
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值