DAA Practical File
DAA Practical File
2.
Write a program in python to implement 24/08/23
radix sort
3.
Write a program in python to implement 24/08/23
counting sort
4.
Write a program in python to implement 14/09/23
binary search tree
5.
Write a program in python to implement 14/09/23
AVL Tree
6.
Write a program in python to implement 05/10/23
BFS
7.
Write a program in python to implement 05/10/23
DFS
8.
Write a program in python to implement 12/10/23
prim’s algorithm
9.
Write a program in python to implement 12/10/23
Kruskal algorithm
10.
Write a program in python to implement 02/11/23
Dijkstra’s algorithm
Q1: Write a program in python to implement heap sort.
largest = i
left = 2 * i + 1
right = 2 * i + 2
largest = left
largest = right
if largest != i:
heapify(arr, n, largest)
def heap_sort(arr):
n = len(arr)
heapify(arr, n, i)
heapify(arr, i, 0)
if __name__ == "__main__":
heap_sort(arr)
n = len(arr)
output = [0] * n
count = [0] * 10
for i in range(n):
count[index] += 1
count[i] += count[i - 1]
i=n-1
while i >= 0:
output[count[index] - 1] = arr[i]
count[index] -= 1
i -= 1
for i in range(n):
arr[i] = output[i]
def radix_sort(arr):
max_element = max(arr)
exp = 1
counting_sort(arr, exp)
exp *= 10
if __name__ == "__main__":
def counting_sort(arr):
max_element = max(arr)
min_element = min(arr)
for i in range(len(arr)):
count[arr[i] - min_element] += 1
count[i] += count[i - 1]
count[arr[i] - min_element] -= 1
for i in range(len(arr)):
arr[i] = output[i]
if __name__ == "__main__":
arr = [4, 2, 2, 8, 3, 3, 1]
counting_sort(arr)
class Node:
self.key = key
self.left = None
self.right = None
class BinarySearchTree:
def __init__(self):
self.root = None
if root is None:
return Node(key)
else:
return root
return root
def in_order_traversal(self):
result = []
self._in_order_recursive(self.root, result)
return result
if root:
self._in_order_recursive(root.left, result)
result.append(root.key)
self._in_order_recursive(root.right, result)
if __name__ == "__main__":
bst = BinarySearchTree()
bst.insert(50)
bst.insert(30)
bst.insert(70)
bst.insert(20)
bst.insert(40)
bst.insert(60)
bst.insert(80)
print(bst.in_order_traversal())
search_key = 40
if bst.search(search_key):
else:
class AVLNode:
self.key = key
self.left = None
self.right = None
self.height = 1
class AVLTree:
def __init__(self):
self.root = None
if node is None:
return 0
return node.height
if node is None:
return 0
x = y.left
T2 = x.right
x.right = y
y.left = T2
self._update_height(y)
self._update_height(x)
return x
y = x.right
T2 = y.left
y.left = x
x.right = T2
self._update_height(x)
self._update_height(y)
return y
if node is None:
return 0
if root is None:
return AVLNode(key)
else:
self._update_height(root)
balance = self._balance(root)
if balance > 1:
return self._rotate_right(root)
else:
root.left = self._rotate_left(root.left)
return self._rotate_right(root)
return self._rotate_left(root)
else:
root.right = self._rotate_right(root.right)
return self._rotate_left(root)
return root
if root is None:
return root
else:
if root.left is None:
temp = root.right
root = None
return temp
temp = root.left
root = None
return temp
temp = self._min_value_node(root.right)
root.key = temp.key
if root is None:
return root
self._update_height(root)
balance = self._balance(root)
if balance > 1:
if self._balance(root.left) >= 0:
return self._rotate_right(root)
else:
root.left = self._rotate_left(root.left)
return self._rotate_right(root)
if self._balance(root.right) <= 0:
return self._rotate_left(root)
else:
root.right = self._rotate_right(root.right)
return self._rotate_left(root)
return root
current = node
current = current.left
return current
result = []
if root:
result += self.in_order_traversal(root.left)
result.append(root.key)
result += self.in_order_traversal(root.right)
return result
if __name__ == "__main__":
avl_tree = AVLTree()
print(avl_tree.in_order_traversal(avl_tree.root))
avl_tree.delete_key(30)
print(avl_tree.in_order_traversal(avl_tree.root))
Q6. Write a program in python to implement BFS.
class Graph:
def __init__(self):
self.graph = defaultdict(list)
self.graph[u].append(v)
queue = []
visited[start] = True
queue.append(start)
while queue:
node = queue.pop(0)
if not visited[neighbor]:
visited[neighbor] = True
queue.append(neighbor)
if __name__ == "__main__":
graph = Graph()
graph.add_edge(0, 1)
graph.add_edge(0, 2)
graph.add_edge(1, 2)
graph.add_edge(2, 0)
graph.add_edge(2, 3)
graph.add_edge(3, 3)
start_node = 2
graph.bfs(start_node)
Q7. Write a program in python to implement DFS.
class Graph:
def __init__(self):
self.graph = defaultdict(list)
self.graph[u].append(v)
visited[node] = True
if not visited[neighbor]:
self.dfs(neighbor, visited)
self.dfs(start, visited)
if __name__ == "__main__":
graph = Graph()
graph.add_edge(0, 1)
graph.add_edge(0, 2)
graph.add_edge(1, 2)
graph.add_edge(2, 0)
graph.add_edge(2, 3)
graph.add_edge(3, 3)
start_node = 2
graph.depth_first_search(start_node)
Q8. Write a program in python to implement prim’s algorithm.
import sys
class Graph:
self.V = vertices
self.graph[u][v] = weight
self.graph[v][u] = weight
min_val = float('inf')
min_index = -1
for v in range(self.V):
min_val = key[v]
min_index = v
return min_index
def prim_mst(self):
key[0] = 0
for _ in range(self.V):
u = self.min_key(key, mst_set)
mst_set[u] = True
for v in range(self.V):
parent[v] = u
print("Edge \tWeight")
print(f"{parent[i]} - {i}\t{self.graph[i][parent[i]]}")
if __name__ == "__main__":
g = Graph(5)
g.add_edge(0, 1, 2)
g.add_edge(0, 3, 6)
g.add_edge(1, 2, 3)
g.add_edge(1, 3, 8)
g.add_edge(1, 4, 5)
g.add_edge(2, 4, 7)
g.add_edge(3, 4, 9)
g.prim_mst()
Q9. Write a program in python to implement Kruskal algorithm.
class Graph:
self.V = vertices
self.graph = []
self.graph.append([u, v, w])
if parent[i] == i:
return i
root_x = self.find(parent, x)
root_y = self.find(parent, y)
parent[root_x] = root_y
parent[root_y] = root_x
else:
parent[root_y] = root_x
rank[root_x] += 1
def kruskal_mst(self):
result = []
i, e = 0, 0
rank = []
parent.append(node)
rank.append(0)
u, v, w = self.graph[i]
i += 1
x = self.find(parent, u)
y = self.find(parent, v)
if x != y:
e += 1
result.append([u, v, w])
self.union(parent, rank, x, y)
print("Edge \tWeight")
for u, v, w in result:
print(f"{u} - {v}\t{w}")
if __name__ == "__main__":
g = Graph(5)
g.add_edge(0, 1, 2)
g.add_edge(0, 3, 6)
g.add_edge(1, 2, 3)
g.add_edge(1, 3, 8)
g.add_edge(1, 4, 5)
g.add_edge(2, 4, 7)
g.add_edge(3, 4, 9)
g.kruskal_mst()
Q10. Write a program in python to implement Dijkstra’s algorithm.
import sys
class Graph:
self.V = vertices
self.graph[u][v] = w
self.graph[v][u] = w
min_val = float('inf')
min_index = -1
for v in range(self.V):
min_val = dist[v]
min_index = v
return min_index
dist[src] = 0
for _ in range(self.V):
u = self.min_distance(dist, spt_set)
spt_set[u] = True
for v in range(self.V):
if not spt_set[v] and self.graph[u][v] > 0 and dist[u] + self.graph[u][v] < dist[v]:
dist[v] = dist[u] + self.graph[u][v]
self.print_solution(dist)
print(f"{node}\t{dist[node]}")
if __name__ == "__main__":
g = Graph(9)
g.add_edge(0, 1, 4)
g.add_edge(0, 7, 8)
g.add_edge(1, 2, 8)
g.add_edge(1, 7, 11)
g.add_edge(2, 3, 7)
g.add_edge(2, 8, 2)
g.add_edge(2, 5, 4)
g.add_edge(3, 4, 9)
g.add_edge(3, 5, 14)
g.add_edge(4, 5, 10)
g.add_edge(5, 6, 2)
g.add_edge(6, 7, 1)
g.add_edge(6, 8, 6)
g.add_edge(7, 8, 7)
start_node = 0
g.dijkstra(start_node)