先上個冒泡排序的效果圖:
是不是,有那么一點點像了? 其實要做這個動圖真不是很難,來看冒泡的代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
>>> 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操作
動態排序的完整代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
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
2
3
4
|
1.root = tk.Tk() #Tkinter建立窗口 2.root.geometry('640x480') #設置分辨率 3.root.title('Bubble Sort') #設置窗口標題 4.root.resizable(False,False) #取消窗口大小變動 |
1
2
3
4
5
6
7
8
|
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
2
3
4
5
|
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
2
|
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冒泡排序動圖實現的資料請關注服務器之家其它相關文章!
原文鏈接:https://blog.csdn.net/boysoft2002/article/details/120319189