python编程冒泡排序法实现动图排序示例解析

 更新时间:2021年10月03日 09:56:45   作者:Hann Yang  
这篇文章主要介绍了python编程中如何使用冒泡排序法实现动图排序的示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步

先上个冒泡排序的效果图:

 是不是,有那么一点点像了? 其实要做这个动图真不是很难,来看冒泡的代码:

>>> def Bubble(List):
	L = len(List)-1
	for i in range(L):
		for j in range(L-i):
			if List[j]>List[j+1]:
				List[j],List[j+1]=List[j+1],List[j]
	return List
 
>>> lst = [randint(1,20) for _ in range(15)]
>>> lst
[1, 10, 4, 18, 3, 15, 8, 8, 20, 12, 14, 14, 20, 6, 19]
>>> Bubble(lst)
[1, 3, 4, 6, 8, 8, 10, 12, 14, 14, 15, 18, 19, 20, 20]

动态排序的原理

冒泡排序就是在循环中当List[j]>List[j+1]时不停交换元素,双循环结果排序即成。那么,在做动图时,除了交换元素,还要交换色块位置以及数字标注的值。用python自带的tkinter库,写gui界面比较容易。添加一个画布canvas和两个按钮button然后用create_rectangle 和 create_text 画色块和文字标签;在冒泡排序的循环中添加交换它们位置的代码即可。另外,改变文本和填充颜色用itemconfig()函数,参数分别用 text和fill。

更多注释见第三部分;

python常用颜色表参见:Python编程tkinter库Canvas实现涂鸦颜色表及围棋盘示例

Python tkinter库Canvas操作

动态排序的完整代码

import tkinter as tk
from random import randint
from time import sleep
 
def init():
    global rect,font,pos,lst,step
    count = 20
    rect,font,pos = [0]*count,[0]*count,[]
    lst = [randint(1,20) for _ in range(count)]
    x,y = 45,330
    width,step = 15,28
    cv.delete('all')
    for i in range(count):
        pos.append((x+i*step,y-lst[i]*width,x+i*step+width,y))
        sleep(0.1)
        rect[i] = cv.create_rectangle(pos[i], fill='royalblue')
        font[i] = cv.create_text(x+i*step+7,y+10,text=str(lst[i]),anchor=tk.CENTER)
        cv.update()
    btn2.configure(state=tk.NORMAL)
    btn1.configure(state=tk.DISABLED) 
def bubble():
    global cv,rect,font,pos,lst,step
    L = len(lst)-1
    btn2.configure(state=tk.DISABLED)
    for i in range(L):
        for j in range(L-i):
            if lst[j]>lst[j+1]:
                lst[j],lst[j+1] = lst[j+1],lst[j]
                cv.move(rect[j],step,0)
                cv.move(rect[j+1],-step,0)
                rect[j],rect[j+1]=rect[j+1],rect[j]
                cv.itemconfig(font[j],text = str(lst[j]),fill='red')
                cv.itemconfig(font[j+1],text = str(lst[j+1]),fill='red')
                cv.itemconfig(rect[j],fill='orangered')
                cv.itemconfig(rect[j+1],fill='orangered')
                cv.update()
                sleep(0.4)
                cv.itemconfig(font[j],fill='black')
                cv.itemconfig(font[j+1],fill='black')
                cv.itemconfig(rect[j],fill='royalblue')
                cv.itemconfig(rect[j+1],fill='royalblue')
                cv.update()
    btn1.configure(state=tk.NORMAL)
def main():
    global cv,btn1,btn2
    root = tk.Tk()
    root.geometry('640x480')
    root.title('Bubble Sort')
    root.resizable(False,False)
    cv = tk.Canvas(root, width=640, height=380, bg='aliceblue')
    cv.pack()
    btn1 = tk.Button(root,text='Create',command=init)
    btn1.place(x=240,y=420)
    btn2 = tk.Button(root,text='Bubble',command=bubble,state=tk.DISABLED)
    btn2.place(x=320,y=420)
    root.mainloop() 
if __name__=="__main__":
 
    app = main()
    

部分代码注释

给初次接触 tkinter 控件的新同学给点代码注释,大佬们略过:

1.root = tk.Tk()   #Tkinter建立窗口 
2.root.geometry('640x480')  #设置分辨率
3.root.title('Bubble Sort')  #设置窗口标题
4.root.resizable(False,False) #取消窗口大小变动
1.cv = tk.Canvas(root, width=640, height=380, bg='aliceblue')  #创建画面
2.cv.pack()  # 控件布局方式: .pack自动填充空间 .place指定位置 
3.btn1 = tk.Button(root,text='Create',command=init)  #创建按钮
4.btn1.place(x=240,y=420)  # place() 指定控件横纵坐标x,y
5.btn2 = tk.Button(root,text='Bubble',command=bubble,state=tk.DISABLED)
6.btn2.place(x=320,y=420)
7.# Canvas(): width height = 宽、高 bg=背景填充色
8.# Button():  text=按钮标题,command=绑定函数,state=按钮状态
1.rect[i] = cv.create_rectangle(pos[i], fill='royalblue')  #在画布上创建矩形
2.font[i] = cv.create_text(x+i*step+7,y+10,text=str(lst[i]),anchor=tk.CENTER)
3.# create_text 参数: X,Y坐标 ,text 文字, anchor=tk.CENTER 居中 
4.btn2.configure(state=tk.NORMAL)  #恢复btn2按钮可点击状态
5.btn1.configure(state=tk.DISABLED) #设置btn2不可点击
1.cv.move(rect[j+1],X,Y) #画布子控件相对位置移动, X,Y正数向右或下,负数反向
2.cv.itemconfig(font[j],text = str(lst[j]),fill='red') #画布子控件的参数设置文字颜色等

如果你想要其它功能,就可以考虑增加滑块钮联动count变量来改变初始化时色块的数量,或者增加速度变量改变色块交换的速度等等。常见排序有十种,基本上制作动图的原理是一样的,只要知道排序的代码就能做,开动起来自己动手去制作吧!

---All done!

以上就是python编程冒泡排序法实现动图排序示例解析的详细内容,更多关于python冒泡排序动图实现的资料请关注脚本之家其它相关文章!

相关文章

  • 浅谈python 调用open()打开文件时路径出错的原因

    浅谈python 调用open()打开文件时路径出错的原因

    这篇文章主要介绍了浅谈python 调用open()打开文件时路径出错的原因,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • python常见字符串处理函数与用法汇总

    python常见字符串处理函数与用法汇总

    这篇文章主要介绍了python常见字符串处理函数与用法,结合实例形式详细分析了Python字符串操作函数find、join、replace及split功能、使用技巧与操作注意事项,需要的朋友可以参考下
    2019-10-10
  • Python实现自定义顺序、排列写入数据到Excel的方法

    Python实现自定义顺序、排列写入数据到Excel的方法

    这篇文章主要介绍了Python实现自定义顺序、排列写入数据到Excel的方法,涉及Python针对Excel文件的数据处理及读写相关操作技巧,需要的朋友可以参考下
    2018-04-04
  • Python 设计模式行为型解释器模式

    Python 设计模式行为型解释器模式

    本文介绍了Python解释器模式,解释器模式即Interpreter Pattern,给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子,下面文章进入更深层学习,需要的小伙伴可以参考一下
    2022-02-02
  • Python xmltodict模块安装及代码实例

    Python xmltodict模块安装及代码实例

    这篇文章主要介绍了Python xmltodict模块安装及代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Python实现的生产者、消费者问题完整实例

    Python实现的生产者、消费者问题完整实例

    这篇文章主要介绍了Python实现的生产者、消费者问题,简单描述了生产者、消费者问题的概念、原理,并结合完整实例形式分析了Python实现生产者、消费者问题的相关操作技巧,需要的朋友可以参考下
    2018-05-05
  • Python multiprocessing.Manager介绍和实例(进程间共享数据)

    Python multiprocessing.Manager介绍和实例(进程间共享数据)

    这篇文章主要介绍了Python multiprocessing.Manager介绍和实例(进程间共享数据),本文介绍了Manager的dict、list使用例子,同时介绍了namespace对象,需要的朋友可以参考下
    2014-11-11
  • Python中实现定时任务详解

    Python中实现定时任务详解

    这篇文章主要介绍了Python中实现定时任务详解的相关资料,需要的朋友可以参考下
    2023-07-07
  • Python爬虫部分开篇概念讲解

    Python爬虫部分开篇概念讲解

    在学习Python爬虫部分,需要已经学过Python基础和前端的相关知识,本文对python爬虫概念及原理给大家详细介绍,需要的朋友跟随小编一起看看吧
    2021-04-04
  • Python中的pathlib.Path为什么不继承str详解

    Python中的pathlib.Path为什么不继承str详解

    这篇文章主要给大家介绍了关于Python中pathlib.Path为什么不继承str的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06

最新评论