New - ADA Lab Manual - 24-25
New - ADA Lab Manual - 24-25
VISION
To develop professionals in the field of Artificial Intelligence & Machine Learning equipped to build sustainable and
intelligent solutions that effectively interact with the natural intelligence towards creating a digitally empowered environment
for future generations.
MISSION
To impart practical based learning experience through the curriculum and collaborations with established
research organizations.
To motivate and influence entrepreneurship efforts among students and develop them into great leader.
SYLLABUS COPY
Analysis & Design of Algorithms Lab Semester 4
2 Design and implement C/C++ Program to find Minimum Cost Spanning Tree of a given
connected undirected graph using Prim's algorithm.
3 a. Design and implement C/C++ Program to solve All-Pairs Shortest Paths problem
using Floyd'salgorithm.
b. Design and implement C/C++ Program to find the transitive
closureusing
Warshal's
algorithm.
4 Design and implement C/C++ Program to find shortest paths from a given vertex in a weighted
connected graph to other vertices using Dijkstra's algorithm.
5 Design and implement C/C++ Program to obtain the Topological ordering of vertices in a
given digraph.
6 Design and implement C/C++ Program to solve 0/1 Knapsack problem using Dynamic
Programming method.
9 Design and implement C/C++ Program to sort a given set of n integer elements using
Selection Sort method and compute its time complexity. Run the program for varied values
of n> 5000 and record the time taken to sort. Plot a graph of the time taken versus n. The
elements can be read from a file or can be generated using the random number generator.
10 Design and implement C/C++ Program to sort a given set of n integer elements using Quick
Sort method and compute its time complexity. Run the program for varied values of n> 5000
and record the time taken to sort. Plot a graph of the time taken versus n. The elements can
be read from a file or can be generated using the random number generator.
11 Design and implement C/C++ Program to sort a given set of n integer elements using Merge
Sort method and compute its time complexity. Run the program for varied values of n>
5000, and record the time taken to sort. Plot a graph of the time taken versus n. The elements
can be read from a file or can be generated using the random number generator.
12 Design and implement C/C++ Program for N Queen's problem using Backtracking.
● SEE shall be conducted jointly by the two examiners of the same institute, examiners are
appointed by the Head of the Institute.
● The examination schedule and names of examiners are informed to the university before the
conduction of the examination. These practical examinations are to be conducted between the
schedule mentioned in the academic calendar of the University.
● All laboratory experiments are to be included for practical examination.
● (Rubrics) Breakup of marks and the instructions printed on the cover page of the answer script
to be strictly adhered to by the examiners. OR based on the course requirement evaluation
rubrics shall be decided jointly by examiners.
● Students can pick one question (experiment) from the questions lot prepared by the examiners
jointly.
● Evaluation of test write-up/ conduction procedure and result/viva will be conducted jointly by
examiners.
General rubrics suggested for SEE are mentioned here, writeup-20%, Conduction procedure and
result in -60%, Viva-voce 20% of maximum marks. SEE for practical shall be evaluated for 100
marksand scored marks shall be scaled down to 50 marks (however, based on course type, rubrics
shall be decided by the examiners)
Change of experiment is allowed only once and 15% of Marks allotted to the procedure part are to
bemade zero.
The minimum duration of SEE is 02 hours
Suggested Learning Resources:
● Virtual Labs (CSE): http://cse01-iiith.vlabs.ac.in/
INDEX
PAGE
S.NO EXPERIMENTS
NO
Design and implement C/C++ Program to find Minimum Cost Spanning Tree of a
1. given connected undirected graph using Kruskal's algorithm. 9
Design and implement C/C++ Program to find Minimum Cost Spanning Tree of a
2. 12
given connected undirected graph using Prim's algorithm.
a. Design and implement C/C++ Program to solve All-Pairs Shortest Paths
3. problem using Floyd's algorithm. b. Design and implement C/C++ Program to 15 & 17
find the transitive closure using Warshal's algorithm.
Design and implement C/C++ Program to find shortest paths from a given vertex
4. 19
in a weighted connected graph to other vertices using Dijkstra's algorithm.
Design and implement C/C++ Program to obtain the Topological ordering of
5. 22
vertices in a given digraph
Design and implement C/C++ Program to solve 0/1 Knapsack problem using
6. 24
Dynamic Programming method.
Design and implement C/C++ Program to solve discrete Knapsack and
7. 26
continuous Knapsack problems using greedy approximation method.
Design and implement C/C++ Program to find a subset of a given set S = {sl ,
8. 28
s2,.....,sn} of n positive integers whose sum is equal to a given positive integer d.
9. Design and implement C/C++ Program to sort a given set of n integer elements
using Selection Sort method and compute its time complexity. Run the program
for varied values of n> 5000 and record the time taken to sort. Plot a graph of the 30
time taken versus n. The elements can be read from a file or can be generated
using the random number generator.
10 Design and implement C/C++ Program to sort a given set of n integer elements
using Quick Sort method and compute its time complexity. Run the program for
varied values of n> 5000 and record the time taken to sort. Plot a graph of the 32
time taken versus n. The elements can be read from a file or can be generated
using the
random number generator.
Design and implement C/C++ Program to sort a given set of n integer elements
using Merge Sort method and compute its time complexity. Run the program for
11. varied values of n> 5000, and record the time taken to sort. Plot a graph of the 39
time taken versus n. The elements can be read from a file or can be generated
using
the random number generator.
12 Design and implement C/C++ Program for N Queen's problem using 44
Backtracking.
II SAMPLE VIVA QUESTIONS AND ANSWERS 47-50
PROGRAM 1
1. Design and implement C/C++ Program to find Minimum Cost Spanning Tree of a given
connected undirected graph using Kruskal's algorithm.
Aim : To apply Kruskal's Algorithm for computing the minimum spanning tree is directly
based on the generic MST algorithm. It builds the MST in forest.
Definition: Kruskal’s algorithm is an algorithm in graph theory that finds a minimum spanning
tree for a connected weighted graph. This mean it finds a subset of the edges that forms a tree
that includes every vertex, where the total weight of all the edges in the tree is minimized. If the
graph is not connected, then it finds a minimum spanning forest .It is an example of a greedy
algorithm.
Efficiency: With an efficient sorting algorithm,the time efficiency of Kruskal’s algorithm will
be in O(│E│log│E│)
Algorithm
Start with an empty set A, and select at every stage the shortest edge that has not been chosen or
rejected, regardless of where this edge is situated in graph.
• If an edge (u, v) connects two different trees, then (u, v) is added to the set of edges of
the MST, and two trees connected by an edge (u, v) are merged into a single tree.
• On the other hand, if an edge (u, v) connects two vertices in the same tree, then edge (u,
v) is discarded.
Kruskals algorithm can be implemented using disjoint set data structure or priority queue data
structure.
MST_KRUSKAL (G, w)
9. Return A
Program: #include<stdio.h>
#define INF 999 #define MAX 100 int p[MAX],c[MAX]
[MAX],t[MAX][2];
int find(int v)
{ while(p[v]) v=p[v];
return v;
}
void kruskal(int n)
{ int i,j,k,u,v,min,res1,res2,sum=0;
for(k=1;k<n;k++)
{ min=INF;
for(i=1;i<n-1;i++)
{ for(j=1;j<=n;j++)
{
if(i==j)continue;
if(c[i][j]<min)
{
u=find(i);
v=find(j); if(u!=v)
{ res1=i;
res2=j
;
min=c[i][j];
}
}
}
}
union1(res1,find(res2)); t[k]
[1]=res1;
t[k][2]=res2; sum=sum+min;
} printf("\nCost of spanning tree
is=%d",sum);
int main()
{
int i,j,n;
printf("\nEnter the n
value:"); scanf("%d",&n);
for(i=1;i<=n;i++) p[i]=0;
printf("\nEnter the graph data:\n");
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&c[i][j]);
kruskal(n);
return 0;
}
Input/Output:
Enter the n value:5
Enter the graph data:
0 10 15 9 999
10 0 999 17 15
15 999 0 20 999
9 17 20 0 18
999 15 999 18 0 Cost of
spanning tree is=49
Program2
2. Design and implement C/C++ Program to find Minimum Cost Spanning Tree of a given
connected undirected graph using Prim's algorithm.
Aim:To find minimum spanning tree of a given graph using prim’s algorithm
Definition: Prim’s is an algorithm that finds a minimum spanning tree for a connected weighted
undirected graph. This means it finds a subset of the edges that forms a tree that includes every
vertex, where the total weight of all edges in the tree is minimized. Prim’s algorithm is an
example of a greedy algorithm.
Algorithm
MST_PRIM (G, w, v)
1. Q ← V[G]
2. for each u in Q do
3. key [u] ← ∞
4. key [r] ← 0
5. π[r] ← NIl
6. while queue is not empty do
7. u ← EXTRACT_MIN (Q)
8. for each v in Adj[u] do
9. if v is in Q and w(u, v) < key [v]
10. then π[v] ← w(u, v)
11. key [v] ← w(u, v)
Analysis
The performance of Prim's algorithm depends of how we choose to implement the priority queue
Q.
Program:
#include<stdio.h>
// #include<conio.h>
#define INF 999
ver[i]=s;
d[i]=c[s][i];
v[i]=0; } v[s]=1;
for(i=1;i<=n-1;i++)
{ min=INF;
for(j=1;j<=n;j++)
if(v[j]==0 && d[j]<min)
{ min=d[j];
u=j
; } v[u]=1;
sum=sum+d[u]; printf("\n%d -> %d
sum=%d",ver[u],u,sum);
for(j=1;j<=n;j++)
if(v[j]==0 && c[u]
[j]<d[j])
{
d[j]=c[u][j];
ver[j]=u;
}
}
return sum; }
void main()
{ int c[10][10],i,j,res,s,n;
clrscr();
printf("\nEnter n value:");
scanf("%d",&n); printf("\nEnter the
graph data:\n");
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) scanf("%d",&c[i]
[j]); printf("\nEnter the souce
node:"); scanf("%d",&s);
res=prim(c,n,s); printf("\nCost=
%d",res); getch();
}
Input/output:
Enter n value:3
Enter the graph
data:
0 10 1
10 0 6
160
Enter the souce node:1
1 -> 3 sum=1
3 -> 2 sum=7
Department of AIML KNSIT Page 12
Analysis & Design of Algorithms Laboratory (BCSL404)
Cost=7
Program 3
a. Design and implement C/C++ Program to solve All-Pairs Shortest Paths problem using
Floyd's algorithm. b. Design and implement C/C++ Program to find the transitive closure
using Warshal's algorithm.
Definition: The Floyd algorithm is a graph analysis algorithm for finding shortest paths in a
weighted graph (with positive or negative edge weights). A single execution of the algorithm will
find the lengths (summed weights) of the shortest paths between all pairs of vertices though it
does not return details of the paths themselves. The algorithm is an example of dynamic
programming Algorithm:
Floyd’s Algorithm
Accept no .of vertices
Call graph function to read weighted graph // w(i,j) Set
D[ ] <- weighted graph matrix // get D {d(i,j)} for k=0
// If there is a cycle in graph, abort. How to find?
Repeat for k = 1 to n
Repeat for i = 1 to n
Repeat for j = 1 to n
D[i,j] = min {D[i,j], D[i,k] + D[k,j]}
Print D
Program A:
#include<stdio.h>
#include<conio.h>
#define INF 999
void main()
{
int a[10][10],n,i,j;
clrscr();
input/Output: Enter
the n value:4
Enter the graph data:
0 999 3 999
2 0 999 999
999 7 0 1
6 999 999 0
Shortest path matrix
0 10 3 4
2056
7701
6 16 9 0
3B
Definition: The Floyd-Warshall algorithm is a graph analysis algorithm for finding shortest
paths in a weighted graph. A single execution of the algorithm will find the lengths of the
shortest path between all pairs of vertices though it does not return details of the paths
themselves. The algorithm is an example of Dynamic programming.
Algorithm : B
//Input: Adjacency matrix of digraph
//Output: R, transitive closure of digraph
Accept no .of vertices
Call graph function to read directed graph
Set R[ ] <- digraph matrix // get R {r(i,j)} for k=0
Print digraph
Repeat for k = 1 to n
Repeat for i = 1 to n
Repeat for j = 1 to n
R(i,j) = 1 if
{rij(k-1) = 1 OR rik(k-1) = 1 and rkj(k-1)
= 1} Print R
Program:
#include<stdio.h> void
warsh(int p[][10],int n)
{
int i,j,k;
for(k=1;k<=n;k++) for(i=1;i<=n;i++)
for(j=1;j<=n;j++) p[i][j]=p[i][j] || p[i][k]
&& p[k][j];
}
int main()
{
int a[10][10],n,i,j; printf("\
nEnter the n value:");
scanf("%d",&n); printf("\nEnter
the graph data:\n");
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&a[i][j]);
warsh(a,n); printf("\nResultant
path matrix\n"); for(i=1;i<=n;i++)
{ for(j=1;j<=n;j++)
printf("%d ",a[i][j]);
printf("\n"); }
return 0;
}
Input/Output: Enter
the n value:4
Enter the graph data:
0100
000100001010
Resultant path matrix
1111
1111
0000
1111
Program4
Design and implement C/C++ Program to find shortest paths from a given vertex in a
weighted connected graph to other vertices using Dijkstra's algorithm.
Aim:To find shortest path using Dijikstra’s algorithm.
Definition: Dijikstra’s algorithm -For a given source vertex(node) in the graph, the algorithm
finds the path with lowest cost between that vertex and every other vertex. It can also be used for
finding cost of shortest paths from a single vertex to a single destination vertex by stopping the
algorithm once the shortest path to the destination vertex has been determined.
Efficiency:1) 2)-graph represented by weighted matrix and priority queue as
unordered array 2)O(│E│log│v│)-graph represented by adjacency lists and priority queue as
min-heap
Algorithm: Dijikstra(G,s)
//Dijikstra’s algorithm for single source shortest path
//input:A weighted connected graph with non negative weights and its vertex s
//output:The length dv of a shortest path from s to v and penultimate vertex pv for every vertex v
in V
Initialize(Q)
for every vertex v in V do dv<-∞;Pv<-
null
Insert(Q,v,dv)
Ds<-0; Decrease(Q,s,ds);VT<-ǿ
for i<- 0 to │V│-1 do u*<-
DeleteMin(Q)
VT<-VT U{u*}
For every vertex u in V-VT that is adjacent to u*
do If du*+w(u*,u)<du du<- du*+w(u*,u); pu<-u*
Decrease(Q,u,du)
Program:
#include<stdio.h> #define INF 999 void
dijkstra(int c[10][10],int n,int s,int
d[10])
{ int v[10],min,u,i,j;
for(i=1;i<=n;i++)
{ d[i]=c[s][i];
v[i]=0;
}
v[s]=1;
for(i=1;i<=n;i++)
{
min=INF;
for(j=1;j<=n;j++)
int main()
{ int c[10][10],d[10],i,j,s,sum,n; printf("\
nEnter n value:");
scanf("%d",&n); printf("\nEnter the
graph
data:\n"); for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&c[i][j]);
printf("\nEnter the souce
node:"); scanf("%d",&s);
dijkstra(c,n,s,d);
for(i=1;i<=n;i++)
printf("\nShortest distance from %d to %d
is %d",s,i,d[i]); return
0; }
Input/Output
Enter n value:6
Enter the graph
data:
0 15 10 999 45 999
999 0 15 999 20 999
20 999 0 20 999 999
999 10 999 0 35 999
999 999 999 30 0 999
999 999 999 4 999 0
Enter the souce node:2
Shortest distance from 2 to 1 is 35
Shortest distance from 2 to 2 is 0
Shortest distance from 2 to 3 is 15
Shortest distance from 2 to 4 is 35
Shortest distance from 2 to 5 is 20
Shortest distance from 2 to 6 is 999
0 15 10 9999 45 9999
9999 0 15 9999 20 9999
20 9999 0 20 9999 9999
9999 10 9999 0 35 9999
9999 9999 9999 30 0 9999
9999 9999 9999 4 9999 0
6->1=49
6->2=14
6->3=29
6->4=4
6->5=34 6->6=0
Program5
Design and implement C/C++ Program to obtain the Topological ordering of vertices in a
given digraph
#include<stdio.h>
//
#include<conio.h>
int temp[10],k=0;
void sort(int a[][10],int id[],int n)
{
int i,j;
for(i=1;i<=n;i++)
{
if(id[i]==0)
{
id[i]=-1; temp[+
+k]=i;
for(j=1;j<=n;j++)
{
if(a[i][j]==1 && id[j]!=-1)
id[j]--;
} i=0;}}}
void main()
{
int a[10][10],id[10],n,i,j;
// clrscr();
printf("\nEnter the n value:");
scanf("%d",&n); for(i=1;i<=n;i+
+)
id[i]=0;
printf("\nEnter the graph data:\
n"); for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
scanf("%d",&a[i][j]
); if(a[i][j]==1)
id[j]++;
}
sort(a,id,n);
if(k!=n)
printf("\nTopological ordering not
possible"); else { printf("\nTopological
ordering is:"); for(i=1;i<=k;i++)
printf("%d ",temp[i]); }
// getch();
}
Input/output:
Enter the n value:6
Enter the graph data:
001100
000110
000101
000001
000001
000000
Topological ordering is:1 2 3 4 5 6
Program6
Design and implement C/C++ Program to solve 0/1 Knapsack problem using Dynamic
Programming method.
ALGORITHM
PROGRAM:
#include<stdio.h>
int w[10],p[10],n;
Input/Output:
Enter the no. of objects:4
Enter the knapsack
capacity:6 Enter profit
followed by weight: 78 2
45 3
92 4
71 5
Max profit=170
Program7
Design and implement C/C++ Program to solve discrete Knapsack and continuous
Knapsack problems using greedy approximation method.
This program first calculates the profit-to-weight ratio for each item, then sorts the items based
on this ratio in non-increasing order. It then fills the knapsack greedily by selecting items with
the highest ratio until the knapsack is full. If there's space left in the knapsack after selecting
whole items, it adds fractional parts of the next item. Finally, it prints the optimal solution and
the solution vector.
Here's a simplified version of the C program to solve discrete Knapsack and
continuous Knapsack problems using the greedy approximation method:
#include <stdio.h>
#define MAX 50
temp2 = p[i];
p[i] = p[j]; p[j] =
temp2;
}
}
} int
curr
Department of AIML KNSIT Page 26
Analysis & Design of Algorithms Laboratory (BCSL404)
ent
Wei
ght
= 0;
max
profi
t=
0.0;
int main() {
printf("Enter the number of objects: ");
scanf("%d", &n);
scanf("%d", &m);
greedyKnapsack(n, w, p, m);
return 0;
}
Program8
Design and implement C/C++ Program to find a subset of a given set S = {sl , s2,.....,sn} of n
positive integers whose sum is equal to a given positive integer d.
AIM: An instance of the Subset Sum problem is a pair (S, t), where S = {x1, x2,..., xn} is a set of
positive integers and t (the target) is a positive integer. The decision problem asks for a subset of
S whose sum is as large as possible, but not larger than t. Algorithm: SumOfSub (s, k, r)
//Values of x[ j ], 1 <= j < k, have been determined
//Node creation at level k taking place: also call for creation at level K+1 if possible
// s = sum of 1 to k-1 elements and r is sum of k to n
elements //generating left child that means including k in
solution Set x[k] = 1
If (s + s[k] = d) then subset found, print solution
If (s + s[k] + s[k+1] <=d) then SumOfSum (s +
s[k], k+1, r – s[k]) //Generate right child i.e.
element k absent
If (s + r - s[k] >=d) AND (s + s[k+1] )<=d
THEN { x[k]=0;
SumOfSub(s, k+1, r – s[k])
Program:
#include<stdio.h>
//
#include<conio.h>
#define MAX 10
int
s[MAX],x[MAX],
d;
void sumofsub(int p,int k,int r)
{
int i;
x[k]=1;
if((p+s[k])==d)
{ for(i=1;i<=k;i++)
if(x[i]==1)
printf("%d ",s[i]);
printf("\n");
}
else
if(p+s[k]+s[k+1]<=d) sumofsub(p+s[k],k+1,r-
s[k]); if((p+r-s[k]>=d) && (p+s[k+1]<=d))
{ x[k]=0;
sumofsub(p,k+1,r-s[k]);
}
}
int main()
{ int i,n,sum=0;
printf("\nEnter the n value:");
scanf("%d",&n);
printf("\nEnter the set in increasing order:");
for(i=1;i<=n;i++)
scanf("%d",&s[i]);
printf("\nEnter the max subset
value:"); scanf("%d",&d); for(i=1;i<=n;i++)
sum=sum+s[i];
if(sum<d || s[1]>d) printf("\nNo subset
possible"); else
sumofsub(0,1,sum);
return 0;
}
Input/output:
Enter the n value:9
Enter the set in increasing order:1 2 3 4 5 6 7 8 9
Enter the max subset value:9
126
13518
234
27
36
459
Program9
Design and implement C/C++ Program to sort a given set of n integer elements using
Selection Sort method and compute its time complexity. Run the program for varied values
of n> 5000 and record the time taken to sort. Plot a graph of the time taken versus n. The
elements can be read from a file or can be generated using the random number generator.
Aim: Sort a given set of elements using Selection sort and determine the time required to sort
elements. Repeat the experiment for different values of n, the number of elements in the list to be
sorted and plot a graph of the time taken versus n.
Definition: selection sort is a sorting routine that scans a list of items repeatedly and, on each
pass, selects the item with the lowest value and places it in its final position. It is based on brute
force approach. Sequential search is a Θ(n2) algorithm on all inputs.
Algorithm:
SelectionSort(A[0…n-1])
//sort a given array by select5ion sort
//input:A[0…n-1]of orderable elements
Output:Array a[0…n-1] Sorted in ascending
order for i<- 0 to n-2 do min<-i for j<-i+1 to
n-1 do if A[j]<A[min] min<-j swap A[i] and
A[min] program: #include<stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void selectionSort(int arr[], int n)
{ int i, j, min_idx;
for (i = 0; i < n-1; i++)
{ min_idx = i;
for (j = i+1; j < n; j++)
{
if (arr[j] < arr[min_idx])
{
min_idx = j;
int temp = arr[min_idx];
arr[min_idx] = arr[i];
arr[i] = temp; }}
void generateRandomNumbers(int arr[], int n)
{
for (int i = 0; i < n; i++)
{
arr[i] = rand() % 10000;
}
}
int main()
{
int n;
printf("Enter number of elements: ");
scanf("%d", &n);
if (n <= 5000)
{
printf("Please enter a value greater than 5000\n");
return 1;
}
int *arr = (int *)malloc(n * sizeof(int));
if (arr == NULL)
{
printf("Memory allocation failed\n");
return 1;
} generateRandomNumbers(arr, n);
clock_t start = clock();
selectionSort(arr, n);
clock_t end = clock();
double time_taken = ((double)(end - start)) / CLOCKS_PER_SEC;
printf("Time taken to sort %d elements: %f seconds\n", n, time_taken);
free(arr);
return 0;
}
Input /output:
Enter number of elements: 6000
Time taken to sort 6000 elements: 0.031000 seconds
********************************************************************
Enter number of elements: 7000
Time taken to sort 7000 elements: 0.034000 seconds
********************************************************************
Enter number of elements: 8000
Time taken to sort 8000 elements: 0.047000 seconds
********************************************************************
Enter number of elements: 9000
Time taken to sort 9000 elements: 0.052000 seconds
********************************************************************
Enter number of elements: 10000
Time taken to sort 10000 elements: 0.077000 seconds
# data collected
n_values = [6000, 7000, 8000, 9000, 10000]
time_taken = [0.031000, 0.034000, 0.047000, 0.052000, 0.077000] # replace with actual times
recorded
Program10
Design and implement C/C++ Program to sort a given set of n integer elements using Quick
Sort method and compute its time complexity. Run the program for varied values of n>
5000 and record the time taken to sort. Plot a graph of the time taken versus n. The
elements can be read from a file or can be generated using the random number generator.
Aim:
The aim of this program is to sort ‘n’ randomly generated elements using Quick sort and
Plotting the graph of the time taken to sort n elements versus n.
Definition: Quick sort is based on the Divide and conquer approach. Quick sort divides array
according to their value. Partition is the situation where all the elements before some position s
are smaller than or equal to A[s] and all the elements after position s are greater than or equal to
A[s]. Efficiency: Cbest(n) Є Θ(nlog2n),Cworst(n) ЄΘ(n2),Cavg(n)Є1.38nlog2n
Algorithm: Quick sort (A[l….r])
// Sorts a sub array by quick sort
//Input : A sub array A[l..r] of A[0..n-1] ,defined by its left and right indices l
//and r
// Output : The sub array A[l..r] sorted in non
decreasing order if l < r
s = Partition (A[l..r]) //s is a split
position Quick sort (A[l …s-1])
Quick sort (A[s+1…r])
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
{
for (int i = 0; i < n; i++)
{
arr[i] = rand() % 100000; // Generate random numbers between 0 and 99999
}
}
int main()
{
int n;
printf("Enter number of elements: ");
scanf("%d", &n); // Read the number of elements from the user
if (n <= 5000)
{
printf("Please enter a value greater than 5000\n");
return 1; // Exit if the number of elements is not greater than 5000
}
INPUT/OUTPUT :
Enter number of elements: 10000
Time taken to sort 10000 elements: 0.0000 seconds
********************************************************************
Enter number of elements: 20000
Time taken to sort 20000 elements: 0.015000 seconds
********************************************************************
Enter number of elements: 30000
Time taken to sort 30000 elements: 0.011000 seconds
********************************************************************
Enter number of elements: 35000
Time taken to sort 35000 elements: 0.003000 seconds
********************************************************************
Enter number of elements: 50000
Time taken to sort 50000 elements: 0.015000 seconds
Program11
Design and implement C/C++ Program to sort a given set of n integer elements using
Merge Sort method and compute its time complexity. Run the program for varied values of
n> 5000, and record the time taken to sort. Plot a graph of the time taken versus n. The
elements can be read from a file or can be generated using the random number generator.
Aim:
The aim of this program is to sort ‘n’ randomly generated elements using Merge sort and
Plotting the graph of the time taken to sort n elements versus n.
Definition: Merge sort is a sort algorithm based on divide and conquer technique. It divides the
array element based on the position in the array. The concept is that we first break the list into
two smaller lists of roughly the same size, and then use merge sort recursively on the
subproblems, until they cannot subdivide anymore. Then, we can merge by stepping through the
lists in linear time. Its time efficiency is Θ(n log n).
Algorithm: Merge sort (A[0…n-1]
// Sorts array A[0..n-1] by Recursive merge sort
// Input : An array A[0..n-1] elements
// Output : Array A[0..n-1] sorted in non decreasing order
If n > 1
Copy A[0…(n/2)-1] to B[0…(n/2)-1]
Copy A[0…(n/2)-1] to C[0…(n/2)-1]
Mergesort (B[0…(n/2)-1])
Mergesort (C[0…(n/2)-1])
Merge(B,C,A)
Program:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
i = 0;
j = 0;
k = left;
k++;
free(L);
free(R);
}
int main()
{
int n;
printf("Enter the number of elements: ");
scanf("%d", &n);
if (n <= 5000)
{
printf("Please enter a value greater than 5000\n");
return 1; // Exit if the number of elements is not greater than 5000
}
generateRandomArray(arr, n);
// Repeat the sorting process multiple times to increase duration for timing
clock_t start = clock();
for (int i = 0; i < 1000; i++)
{
mergeSort(arr, 0, n - 1);
}
clock_t end = clock();
free(arr);
return 0;
}
INPUT/OUTPUT
Enter number of elements: 6000
Time taken to sort 6000 elements: 0.000709 seconds
********************************************************************
Enter number of elements: 7000
Time taken to sort 7000 elements: 0.000752 seconds
********************************************************************
Enter number of elements: 8000
Time taken to sort 8000 elements: 0.000916 seconds
********************************************************************
Enter number of elements: 9000
Time taken to sort 9000 elements: 0.001493 seconds
********************************************************************
Enter number of elements: 10000
Time taken to sort 10000 elements: 0.001589 seconds
********************************************************************
Enter number of elements: 11000
Time taken to sort 11000 elements: 0.002562 seconds
********************************************************************
Enter number of elements: 12000
Time taken to sort 12000 elements: 0.001944 seconds
********************************************************************
Enter number of elements: 13000
Time taken to sort 13000 elements: 0.002961 seconds
********************************************************************
Program12
Design and implement C/C++ Program for N Queen's problem using Backtracking.
Definition:
The object is to place queens on a chess board in such as way as no queen can capture
another one in a single move
Recall that a queen can move horz, vert, or diagonally an infinite
distance This implies that no two queens can be on the same row, col, or
diagonal We usually want to know how many different placements there
are Using Backtracking Techniques
Algorithm:
/* outputs all possible acceptable positions of n queens on n x n chessboard
*/ // Initialize x [ ] to zero
// Set k = 1 start with first queen
Repeat for i = 1 to n // try all columns one by one for kth queen if
Place (k, i) true then
{ x(k) = i // place kth queen in column i
if (k=n) all queens placed and hence print output
(x[ ]) else NQueens(K+1,n) //try for next queen }
Place (k,i)
/* finds if kth queen in kth row can be placed in column i or not; returns true if queen can be placed
*/
// x[1,2, . . . k-1] have been defined
//queens at (p, q) & (r, s) attack if |p-r| = |q-s|
Repeat for j = 1 to (k-1)
if any earlier jth queen is in ith column
( x[j]= i) or in same diagonal ( abs(x[ j] - i) = abs( j - k) )
then kth queen cannot be placed (return false) return true
(as all positions checked and no objection)
Program:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
void printSolution(int **board, int N)
{
for (int i = 0; i < N; i++)
{
}
bool solveNQUtil(int **board, int N, int col)
{
if (col >= N)
{
return true;
}
for (int i = 0; i < N; i++)
{
if (isSafe(board, N, i, col))
{
board[i][col] = 1;
if (solveNQUtil(board, N, col + 1))
{
return true;
}
board[i][col] = 0;
}
}
return false;
}
bool solveNQ(int N){ int **board = (int **)malloc(N * sizeof(int *));
for (int i = 0; i < N; i++)
{
board[i] = (int *)malloc(N * sizeof(int));
for (int j = 0; j < N; j++)
{
board[i][j] = 0;
}
}
if (!solveNQUtil(board, N, 0))
{
printf("Solution does not exist\n");
for (int i = 0; i < N; i++)
{
free(board[i]);
}
free(board);
return false;
}
printSolution(board, N);
for (int i = 0; i < N; i++)
{
free(board[i]);
}
free(board);
return true;
}
int main()
{
int N;
printf("Enter the number of queens: ");
scanf("%d", &N);
solveNQ(N);
return 0;
}
INPUT/OUTPUT
************************OUTPUT-1************************
************************OUTPUT-2************************
Time complexity of an algorithm indicates the total time needed by the program to run to
completion. It is usually expressed by using the big O notation.
3) The main measure for efficiency algorithm are-Time and space 4. The time complexity of
following code:
int a = 0; for (i = 0; i <
N; i++) { for (j =
N; j > i; j--) { a
= a + i + j;
}
}Ans O(n*n)
14) In quick sort, the number of partitions into which the file of size n is divided by a
selected record is 2
15) The worst-case time complexity of Quick Sort is .O(n2)
23) A sort which compares adjacent elements in a list and switches where necessary is .
A. insertion sort
24) The correct order of the efficiency of the following sorting algorithms according to their
overall running time comparison is bubble>selection>insertion
25) The total number of comparisons made in quick sort for sorting a file of size n, is A. O(n
log n)
27) For
the improvement of efficiency of quick sort the pivot can be .
“the mean element”