-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathalgorithm_visualizer.py
More file actions
127 lines (99 loc) · 3.88 KB
/
algorithm_visualizer.py
File metadata and controls
127 lines (99 loc) · 3.88 KB
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
from tkinter import *
from tkinter import ttk
from tkinter import messagebox
import random
from bubbleSort import bubble_sort
from quicksort import quick_sort
from mergesort import merge_sort
from selectionSort import selection
from insertionsort import insertionSort
root = Tk()
root.resizable(0,0)
root.title('Sorting Algorithm Visualisation')
root.maxsize(900, 600)
root.config(bg='black')
# variables
selected_alg = StringVar()
data = []
# function
def drawData(data, colorArray):
canvas.delete("all")
c_height = 450
c_width = 800
x_width = c_width / (len(data) + 3)
offset = 30
spacing = 10
max_data=max(data)
normalizedData = [i / max_data for i in data]
for i, height in enumerate(normalizedData):
# top left
x0 = i * x_width + offset + spacing
y0 = c_height - height * 340
# bottom right
x1 = (i + 1) * x_width + offset
y1 = c_height
canvas.create_rectangle(x0, y0, x1, y1, fill=colorArray[i])
canvas.create_text(x0+2, y0, anchor=SW, text=str(data[i]))
root.update_idletasks()
def Generate():
global data
if data:
data.clear()
minVal = int(minEntry.get())
maxVal = int(maxEntry.get())
size = int(sizeEntry.get())
if (maxVal-minVal < size ):
messagebox.showwarning('Warning','Differnce of Max Value and Min Value is smaller than the Data Size') # needed condition otherwise , result in infinite while loop later
return
for _ in range(size):
v=random.randrange(minVal,minVal+1)
while v in data: # needed loop to not add duplicates in the list .
v=random.randrange(minVal,maxVal+1)
data.append(v)
drawData(data, ['red' for x in range(len(data))]) # ['red', 'red' ,....]
def StartAlgorithm():
global data
if not data:
return
if algMenu.get() == 'Quick Sort':
quick_sort(data, 0, len(data)-1, drawData, speedScale.get())
elif algMenu.get() == 'Bubble Sort':
bubble_sort(data, drawData, speedScale.get())
elif algMenu.get() == 'Merge Sort':
merge_sort(data, drawData, speedScale.get())
elif algMenu.get() == 'Selection Sort':
selection(data, drawData, speedScale.get())
elif algMenu.get() == 'Insertion Sort':
insertionSort(data, drawData, speedScale.get())
drawData(data, ['green' for x in range(len(data))])
# frame / base lauout
UI_frame = Frame(root, height=300, bg='grey')
UI_frame.grid(row=0, column=0, padx=10, pady=5,sticky='ew')
canvas = Canvas(root, width=800, height=450, bg='white')
canvas.grid(row=1, column=0, padx=10, pady=5)
# User Interface Area
# Row[0]
Label(UI_frame, text="Algorithm: ", bg='grey').grid(
row=0, column=0, padx=18, pady=5, sticky='ew')
algMenu = ttk.Combobox(UI_frame, textvariable=selected_alg, values=[
'Bubble Sort', 'Quick Sort', 'Merge Sort', 'Selection Sort', 'Insertion Sort'])
algMenu.grid(row=0, column=1, padx=18, pady=5,sticky='ew')
algMenu.current(2)
speedScale = Scale(UI_frame, from_=0.1, to=5.0, length=200, digits=2,
resolution=0.2, orient=HORIZONTAL, label="Select Speed [s]")
speedScale.grid(row=0, column=2, padx=18, pady=5)
Button(UI_frame, text="Start", command=StartAlgorithm,
bg='red').grid(row=0, column=3, padx=18, pady=5)
# Row[1]
sizeEntry = Scale(UI_frame, from_=3, to=25, resolution=1,
orient=HORIZONTAL, label="Data Size")
sizeEntry.grid(row=1, column=0, padx=18, pady=5)
minEntry = Scale(UI_frame, from_=0, to=10, resolution=1,
orient=HORIZONTAL, label="Min Value")
minEntry.grid(row=1, column=1, padx=18, pady=5)
maxEntry = Scale(UI_frame, from_=10, to=100, resolution=1,
orient=HORIZONTAL, label="Max Value")
maxEntry.grid(row=1, column=2, padx=18, pady=5)
Button(UI_frame, text="Generate", command=Generate,
bg='white').grid(row=1, column=3, padx=18, pady=5)
root.mainloop()