Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 11e6d67

Browse files
committed
sortings algorithms added and app layout updated
1 parent 6dd6d68 commit 11e6d67

File tree

3 files changed

+266
-17
lines changed

3 files changed

+266
-17
lines changed
9.61 KB
Binary file not shown.

‎main.py

Lines changed: 77 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,46 @@
1717

1818
# Buttons
1919
def start_btn():
20+
2021
global dataset, stop_flag
22+
generateBtn.config(state=DISABLED)
23+
startBtn.config(state=DISABLED)
24+
stopBtn.config(state=NORMAL)
25+
resetBtn.config(state=DISABLED)
26+
2127
if stop_flag:
2228
stop_flag = False
2329
if sorting_algorithm.get() == 'Bubble Sort':
2430
SortingAlgorithms.bubble_sort(dataset, draw_data, animation_speed.get(), stop_flag)
25-
# this part will be updated
31+
comparisons_count = SortingAlgorithms.bubble_sort(dataset, draw_data, animation_speed.get(), stop_flag)
32+
update_header_labels(comparisons_count, 'O(n^2)')
33+
34+
elif sorting_algorithm.get() == 'Quick Sort':
35+
SortingAlgorithms.quick_sort(dataset, 0, len(dataset) - 1, draw_data, animation_speed.get())
36+
draw_data(dataset, ['green' for i in range(len(dataset))])
37+
comparisons_count = SortingAlgorithms.quick_sort(dataset, 0, len(dataset) - 1, draw_data, animation_speed.get())
38+
update_header_labels(comparisons_count, 'O(n log n)')
39+
40+
elif sorting_algorithm.get() == 'Insertion Sort':
41+
SortingAlgorithms.insertion_sort(dataset, draw_data, animation_speed.get())
42+
comparisons_count = SortingAlgorithms.insertion_sort(dataset, draw_data, animation_speed.get())
43+
update_header_labels(comparisons_count, 'O(n^2)')
44+
45+
elif sorting_algorithm.get() == 'Selection Sort':
46+
SortingAlgorithms.selection_sort(dataset, draw_data, animation_speed.get())
47+
comparisons_count = SortingAlgorithms.selection_sort(dataset, draw_data, animation_speed.get())
48+
update_header_labels(comparisons_count, 'O(n^2)')
49+
50+
elif sorting_algorithm.get() == 'Merge Sort':
51+
SortingAlgorithms.merge_sort(dataset, draw_data, animation_speed.get())
52+
draw_data(dataset, ['green' for i in range(len(dataset))])
53+
# comparisons_count = SortingAlgorithms.merge_sort(dataset, draw_data, animation_speed.get())
54+
update_header_labels(10, 'O(n^2)')
55+
56+
generateBtn.config(state=NORMAL)
57+
startBtn.config(state=NORMAL)
58+
stopBtn.config(state=DISABLED)
59+
resetBtn.config(state=NORMAL)
2660

2761

2862
def stop_btn():
@@ -33,6 +67,8 @@ def stop_btn():
3367
def reset_btn():
3468
global dataset
3569
dataset = []
70+
comparison_label.config(text="")
71+
algorithm_complexity_label.config(text="")
3672
draw_data(dataset, [])
3773

3874

@@ -71,17 +107,40 @@ def generate_dataset():
71107
draw_data(dataset, ['#FF597B' for i in range(len(dataset))])
72108

73109

110+
def update_header_labels(comparisons_count, time_complexity):
111+
comparison_label.config(text=f"Comparisons Count: {comparisons_count}")
112+
algorithm_complexity_label.config(text=f"Algorithm Complexity: {time_complexity}")
113+
114+
115+
def process_input():
116+
global dataset
117+
user_input = entry.get()
118+
# Process the input array
119+
array = [int(x) for x in user_input.split(",")]
120+
dataset = []
121+
for i in array:
122+
dataset.append(i)
123+
# draw data
124+
draw_data(dataset, ['#FF597B' for i in range(len(dataset))])
125+
126+
74127
# GUI Setup
75128
sidebar_fr = Frame(root, width=220, height=230, background='#ECF2FF')
76129
sidebar_fr.grid(row=0, column=0, rowspan=3, sticky='ns')
77130

78131
header = Frame(root, width=820, height=130, background='#F3F1F5', padx=0, pady=0)
79132
header.grid(row=0, column=1, padx=0, pady=5, columnspan=1)
80133

134+
comparison_label = Label(header, text="", bg='#fff', font=('consolas', 14, "bold"), pady=12)
135+
comparison_label.pack()
136+
137+
algorithm_complexity_label = Label(header, text="", bg='#fff', font=('consolas', 14, "bold"), pady=12)
138+
algorithm_complexity_label.pack()
139+
81140
cv = Canvas(root, width=820, height=480, background='#fff')
82141
cv.grid(row=1, column=1, padx=0, pady=5, columnspan=1)
83142

84-
combobox = tkinter.ttk.Combobox(sidebar_fr, values=['Bubble Sort', 'Quick Sort'], textvariable=sorting_algorithm)
143+
combobox = tkinter.ttk.Combobox(sidebar_fr, values=['Bubble Sort', 'Quick Sort', 'Insertion Sort', 'Selection Sort', 'Merge Sort'], textvariable=sorting_algorithm)
85144
combobox.grid(row=1, column=0, padx=5, pady=5)
86145
combobox.current(0)
87146

@@ -98,10 +157,22 @@ def generate_dataset():
98157
animation_speed = Scale(sidebar_fr, from_=0.1, to=5.0, length=150, digits=2, resolution=0.1, orient=HORIZONTAL, label='Select Speed(sec)', background='#fff')
99158
animation_speed.grid(row=5, column=0, padx=5, pady=5, sticky=W)
100159

101-
Button(sidebar_fr, text='Generate Dataset', command=generate_dataset, bg='#764AF1', fg='white', width=20).grid(row=6, column=0, padx=5, pady=5)
102-
Button(sidebar_fr, text='Start', command=start_btn, bg='#019267', fg='white', height=1, width=20).grid(row=7, column=0, padx=5, pady=5)
103-
Button(sidebar_fr, text='Reset', command=reset_btn, bg='#FF597B', fg='white', height=1, width=20).grid(row=8, column=0, padx=5, pady=5)
104-
Button(sidebar_fr, text='Stop', command=stop_btn, bg='orange', fg='white', height=1, width=20).grid(row=9, column=0, padx=5, pady=5)
160+
generateBtn = Button(sidebar_fr, text='Generate Dataset', command=generate_dataset, bg='#764AF1', fg='white', width=20)
161+
generateBtn.grid(row=6, column=0, padx=5, pady=5)
162+
startBtn = Button(sidebar_fr, text='Start', command=start_btn, bg='#019267', fg='white', height=1, width=20)
163+
startBtn.grid(row=7, column=0, padx=5, pady=5)
164+
resetBtn = Button(sidebar_fr, text='Reset', command=reset_btn, bg='#FF597B', fg='white', height=1, width=20)
165+
resetBtn.grid(row=8, column=0, padx=5, pady=5)
166+
stopBtn = Button(sidebar_fr, text='Stop', command=stop_btn, bg='orange', fg='white', height=1, width=20, state=DISABLED)
167+
stopBtn.grid(row=9, column=0, padx=5, pady=5)
168+
169+
170+
Label(sidebar_fr, text="---------Or---------", bg='#ECF2FF', font=('consolas', 10, "bold")).grid(row=10, column=0, padx=5, pady=5)
171+
Label(sidebar_fr, text="Enter numbers(,)", bg='#ECF2FF', font=('consolas', 10, "bold")).grid(row=11, column=0, padx=5, pady=5)
172+
entry = Entry(sidebar_fr, width=25)
173+
entry.grid(row=12, column=0, padx=5, pady=5)
174+
Button(sidebar_fr, text="Process Input", height=1, width=20, fg='#fff', bg='purple', command=process_input).grid(row=13, column=0, padx=5, pady=5)
175+
105176

106177
# start the main event loop of the Application
107178
root.mainloop()

‎sorting_algorithms.py

Lines changed: 189 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,197 @@
33

44
class SortingAlgorithms:
55

6-
# Bubble Sort
6+
# Bubble Sort Implementation
77
@staticmethod
8-
def bubble_sort(data_set, draw_d, speed, stop_flag):
9-
for i in range(len(data_set) - 1):
10-
for j in range(len(data_set) - 1):
8+
# def bubble_sort(dataset, draw_data, speed, stop_flag):
9+
# # comparisons counter
10+
# comparisons = 0
11+
# for i in range(len(dataset)):
12+
# for j in range(len(dataset) - i - 1):
13+
# if stop_flag():
14+
# return
15+
# comparisons += 1
16+
# if dataset[j] > dataset[j + 1]:
17+
# # swap elements
18+
# dataset[j], dataset[j + 1] = dataset[j + 1], dataset[j]
19+
# draw_data(dataset, ['#019267' if c == j or c == j + 1 else 'red' for c in range(len(dataset))])
20+
# time.sleep(speed)
21+
#
22+
# draw_data(dataset, ['#019267' for i in range(len(dataset))])
23+
# return comparisons
24+
def bubble_sort(dataset, draw_data, speed, stop_flag):
25+
# comparisons counter
26+
comparisons = 0
27+
i = 0
28+
while i < len(dataset):
29+
j = 0
30+
while j < len(dataset) - i - 1:
1131
if stop_flag:
12-
return
13-
if data_set[j] > data_set[j + 1]:
14-
# swap datas
15-
data_set[j], data_set[j + 1] = data_set[j + 1], data_set[j]
16-
draw_d(data_set, ['#019267' if c == j or c == j + 1 else 'red' for c in range(len(data_set))])
32+
time.sleep(0.1) # Sleep for a short duration to reduce CPU usage
33+
continue # Skip the current iteration and check stop_flag again
34+
comparisons += 1
35+
if dataset[j] > dataset[j + 1]:
36+
# swap elements
37+
dataset[j], dataset[j + 1] = dataset[j + 1], dataset[j]
38+
draw_data(dataset, ['#019267' if c == j or c == j + 1 else 'red' for c in range(len(dataset))])
1739
time.sleep(speed)
40+
j += 1
41+
i += 1
1842

19-
draw_d(data_set, ['#019267' for i in range(len(data_set))])
43+
draw_data(dataset, ['#019267' for i in range(len(dataset))])
44+
return comparisons
2045

21-
# this part will be updated...
46+
# Quick Sort Implementation
47+
@staticmethod
48+
def quick_sort(dataset, start, end, draw_data, speed):
49+
comparisons = 0 # Counter for comparisons
50+
if start < end:
51+
pi, comparisons = SortingAlgorithms.partition(dataset, start, end, draw_data, speed, comparisons)
52+
left_comparisons = SortingAlgorithms.quick_sort(dataset, start, pi - 1, draw_data, speed)
53+
right_comparisons = SortingAlgorithms.quick_sort(dataset, pi + 1, end, draw_data, speed)
54+
comparisons += left_comparisons + right_comparisons
55+
56+
return comparisons
57+
58+
@staticmethod
59+
def partition(dataset, start, end, draw_data, speed, comparisons):
60+
pivot = dataset[end]
61+
62+
draw_data(dataset, SortingAlgorithms.get_colors(len(dataset), start, end, start, start))
63+
time.sleep(speed)
64+
65+
for i in range(start, end):
66+
comparisons += 1 # Increment the counter
67+
68+
if dataset[i] < pivot:
69+
draw_data(dataset, SortingAlgorithms.get_colors(len(dataset), start, end, start, i, True))
70+
time.sleep(speed)
71+
72+
dataset[i], dataset[start] = dataset[start], dataset[i]
73+
start += 1
74+
draw_data(dataset, SortingAlgorithms.get_colors(len(dataset), start, end, start, i))
75+
time.sleep(speed)
76+
77+
draw_data(dataset, SortingAlgorithms.get_colors(len(dataset), start, end, start, end, True))
78+
time.sleep(speed)
79+
dataset[end], dataset[start] = dataset[start], dataset[end]
80+
81+
return start, comparisons
82+
83+
@staticmethod
84+
def get_colors(n, start, end, s, ci, is_swap=False):
85+
colors = []
86+
for i in range(n):
87+
if start <= i <= end:
88+
colors.append('gray')
89+
else:
90+
colors.append('white')
91+
if i == end:
92+
colors[i] = 'blue'
93+
elif i == s:
94+
colors[i] = 'red'
95+
elif i == ci:
96+
colors[i] = 'yellow'
97+
if is_swap:
98+
if i == s or i == ci:
99+
colors[i] = 'green'
100+
return colors
101+
102+
# Selection Sort Implementation
103+
@staticmethod
104+
def selection_sort(dataset, draw_data, speed):
105+
comparisons = 0 # Counter for comparisons
106+
for i in range(len(dataset)):
107+
mini = i
108+
for j in range(i + 1, len(dataset)):
109+
comparisons += 1 # Increment the counter
110+
if dataset[mini] > dataset[j]:
111+
mini = j
112+
draw_data(dataset, ['blue' if c == mini or c == i else 'red' for c in range(len(dataset))])
113+
time.sleep(speed)
114+
dataset[i], dataset[mini] = dataset[mini], dataset[i]
115+
draw_data(dataset, ['green' if c == i or c == mini else 'red' for c in range(len(dataset))])
116+
time.sleep(speed)
117+
draw_data(dataset, ['green' for i in range(len(dataset))])
118+
return comparisons
119+
120+
# Merge Sort Implementation
121+
@staticmethod
122+
def merge_sort(dataset, draw_data, speed):
123+
SortingAlgorithms.merge_sort_(dataset, 0, len(dataset) - 1, draw_data, speed)
124+
# comparisons = SortingAlgorithms.merge_sort_(dataset, 0, len(dataset) - 1, draw_data, speed)
125+
# return comparisons
126+
127+
@staticmethod
128+
def merge_sort_(dataset, left, right, draw_data, speed):
129+
comparisons = 0
130+
if left < right:
131+
mid = (left + right) // 2
132+
SortingAlgorithms.merge_sort_(dataset, left, mid, draw_data, speed)
133+
SortingAlgorithms.merge_sort_(dataset, mid + 1, right, draw_data, speed)
134+
SortingAlgorithms.merge(dataset, left, mid, right, draw_data, speed)
135+
# comparisons += SortingAlgorithms.merge(dataset, left, mid, right, draw_data, speed)
136+
# return comparisons
137+
138+
@staticmethod
139+
def merge(dataset, left, mid, right, draw_data, speed):
140+
comparisons = 0
141+
draw_data(dataset, SortingAlgorithms.color_arr(len(dataset), left, mid, right))
142+
time.sleep(speed)
143+
left_data = dataset[left:mid + 1]
144+
right_data = dataset[mid + 1:right + 1]
145+
146+
li = ri = 0
147+
for i in range(left, right + 1):
148+
if li < len(left_data) and ri < len(right_data):
149+
comparisons += 1
150+
if left_data[li] <= right_data[ri]:
151+
dataset[i] = left_data[li]
152+
li += 1
153+
else:
154+
dataset[i] = right_data[ri]
155+
ri += 1
156+
elif li < len(left_data):
157+
dataset[i] = left_data[li]
158+
li += 1
159+
else:
160+
dataset[i] = right_data[ri]
161+
ri += 1
162+
163+
draw_data(dataset, ['green' if left <= c <= right else 'white' for c in range(len(dataset))])
164+
time.sleep(speed)
165+
# return comparisons
166+
167+
@staticmethod
168+
def color_arr(n, left, mid, right):
169+
colors = []
170+
for i in range(n):
171+
if left <= i <= right:
172+
if left <= i <= mid:
173+
colors.append('yellow')
174+
else:
175+
colors.append('blue')
176+
else:
177+
colors.append('white')
178+
179+
return colors
180+
181+
# Insertion Sort Implementation
182+
@staticmethod
183+
def insertion_sort(dataset, draw_data, speed):
184+
comparisons = 0 # Counter for comparisons
185+
for i in range(1, len(dataset)):
186+
key = dataset[i]
187+
j = i - 1
188+
while j >= 0 and dataset[j] > key:
189+
dataset[j + 1] = dataset[j]
190+
j -= 1
191+
draw_data(dataset, ['green' if x == j + 1 else 'white' for x in range(len(dataset))])
192+
time.sleep(speed)
193+
comparisons += 1 # Increment the counter
194+
dataset[j + 1] = key
195+
draw_data(dataset, ['green' if x == j + 1 else 'white' for x in range(len(dataset))])
196+
time.sleep(speed)
197+
draw_data(dataset, ['green' for x in range(len(dataset))])
198+
199+
return comparisons

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /