-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSorting Algorithim.py
145 lines (125 loc) · 3.62 KB
/
Sorting Algorithim.py
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# Python implementation for visualizing merge sort.
import pygame
import random
pygame.font.init()
# window
screen = pygame.display.set_mode((900, 650))
# Title and Icon
pygame.display.set_caption("Sorting Algorithm Visualisation")
# Boolean variable to run the program in while loop
run = True
# Window size
width = 900
length = 600
array = [0] * 151
arr_clr = [(0, 255, 255)] * 151
clr_ind = 0
clr = [(0, 204, 204), (255, 0, 0),
(0, 0, 153), (255, 102, 0)]
fnt = pygame.font.SysFont("comicsans", 30)
fnt1 = pygame.font.SysFont("comicsans", 20)
# Generate new Array
def generate_arr():
for i in range(1, 151):
arr_clr[i] = clr[0]
array[i] = random.randrange(1, 100)
generate_arr()
def refill():
screen.fill((255, 255, 255))
draw()
pygame.display.update()
pygame.time.delay(20)
# Sorting Algo:Merge sort
def mergesort(array, l, r):
mid = (l + r) // 2
if l < r:
mergesort(array, l, mid)
mergesort(array, mid + 1, r)
merge(array, l, mid,
mid + 1, r)
def merge(array, x1, y1, x2, y2):
i = x1
j = x2
temp = []
pygame.event.pump()
while i <= y1 and j <= y2:
arr_clr[i] = clr[1]
arr_clr[j] = clr[1]
refill()
arr_clr[i] = clr[0]
arr_clr[j] = clr[0]
if array[i] < array[j]:
temp.append(array[i])
i += 1
else:
temp.append(array[j])
j += 1
while i <= y1:
arr_clr[i] = clr[1]
refill()
arr_clr[i] = clr[0]
temp.append(array[i])
i += 1
while j <= y2:
arr_clr[j] = clr[1]
refill()
arr_clr[j] = clr[0]
temp.append(array[j])
j += 1
j = 0
for i in range(x1, y2 + 1):
pygame.event.pump()
array[i] = temp[j]
j += 1
arr_clr[i] = clr[2]
refill()
if y2 - x1 == len(array) - 2:
arr_clr[i] = clr[3]
else:
arr_clr[i] = clr[0]
# Draw the array values
def draw():
# Text should be rendered
txt = fnt.render("Press" \
" 'Enter' To Begin Sorting.", 1, (0, 0, 0))
# Position where text is placed
screen.blit(txt, (20, 20))
txt1 = fnt.render("PRESS 'R' FOR NEW ARRAY.",
1, (0, 0, 0))
screen.blit(txt1, (20, 50))
txt2 = fnt1.render("TYPE: " \
"MERGE SORT", 1, (0, 0, 0))
screen.blit(txt2, (600, 60))
element_width = (width - 150) // 150
boundry_arr = 900 / 150
boundry_grp = 550 / 100
pygame.draw.line(screen, (0, 0, 0),
(0, 95), (900, 95), 6)
for i in range(1, 100):
pygame.draw.line(screen,
(224, 224, 224),
(0, boundry_grp * i + 100),
(900, boundry_grp * i + 100), 1)
# Drawing the array values as lines
for i in range(1, 151):
pygame.draw.line(screen, arr_clr[i], \
(boundry_arr * i - 3, 100), \
(boundry_arr * i - 3, array[i] * boundry_grp + 100), \
element_width)
# Infinite loop to keep the window open
while run:
# background
screen.fill((255, 255, 255))
# Event handler stores all event
for event in pygame.event.get():
# If we click Close button in window
if event.type == pygame.QUIT:
run = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_r:
generate_arr()
if event.key == pygame.K_RETURN:
mergesort(array, 1, len(array) - 1)
draw()
pygame.display.update()
pygame.quit()