0% found this document useful (0 votes)
17 views30 pages

DAA Manual

This document contains information about algorithms courses taught at G M Institute of Technology and Management. It provides code examples and explanations for selection sort, quicksort, mergesort, and the knapsack problem solved with a greedy algorithm. The code examples are in Java and sort arrays of random integers, measuring runtime for different array sizes to analyze time complexity.

Uploaded by

Xdxd
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
17 views30 pages

DAA Manual

This document contains information about algorithms courses taught at G M Institute of Technology and Management. It provides code examples and explanations for selection sort, quicksort, mergesort, and the knapsack problem solved with a greedy algorithm. The code examples are in Java and sort arrays of random integers, measuring runtime for different array sizes to analyze time complexity.

Uploaded by

Xdxd
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 30

G M Institute of Technology and Management ®

Department of Computer Science and Engineering

Course Name: Design and Analysis of Algorithms

Course Code: 21CS42


IV Semester
2021 Scheme

Prepared By :
Ms Meghana G H,
Associate Professor,
Dept of Computer Science and Engineering
Module 1
Program 1: Selection Sort

1. 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. Demonstrate using C++/Java how the
brute force method works along with its time complexity analysis: worst
case, average case and best case.

ALGORITHM
1. k ← length [A]
2. for j ←1 to n-1
3. smallest ← j
4. for I ← j + 1 to k
5. if A [i] < A [ smallest]
6. then smallest ← i
7. exchange (A [j], A [smallest])

Program
package first;
import java.util.Scanner;
public class SelectionSort {
public static void main(String[] args) {
int size, i,j,temp;
int arr[] = new int[5000];
Scanner scan = new Scanner(System.in);
System.out.println("Enter Array Size:");
size = scan.nextInt();
System.out.println("Enter the Array Elements\t");
for(i=0; i<size; i++) {
arr[i] = scan.nextInt();
}
System.out.println("Sorting Array Using Selection Sort Technique...\t");
for(i=0;i<size;i++) {
for(j=i+1; j<size; j++) {
if(arr[i] > arr[j]) {
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
//Display The Sorted Array
System.out.println("Now the Array After Sorting is:\t");
for(i=0; i<size; i++) {
System.out.println(arr[i]+"");
}
}
}
Module 2

Program 1: Quick Sort

1. 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 on graph sheet. The elements can be read from a file or can be
generated using the random number generator. Demonstrate using Java how the divide-and-
conquer method works along with its time complexity analysis: worst case, average case and
best case.

import java.util.Scanner;
import java.util.Arrays;
import java.util.Random;

public class QuickSortComplexity {


static final int MAX = 10005;
static int[] a = new int[MAX];
public static void main(String[] args) {

Scanner input = new Scanner(System.in);


System.out.print("Enter Max array size: ");
int n = input.nextInt();
Random random = new Random();
System.out.println("Enter the array elements: ");
for (int i = 0; i < n; i++)
a[i] = input.nextInt(); // for keyboard entry
// a[i] = random.nextInt(1000); // generate
// random numbers – uniform distribution
// a = Arrays.copyOf(a, n); // keep only non zero elements
// Arrays.sort(a); // for worst-case time complexity

System.out.println("Input Array:");
for (int i = 0; i < n; i++)
System.out.print(a[i] + " ");
// set start time
long startTime = System.nanoTime();
QuickSortAlgorithm(0, n - 1);
long stopTime = System.nanoTime();
long elapsedTime = stopTime - startTime;
System.out.println();
System.out.println("\nSorted Array:");
for (int i = 0; i < n; i++)
System.out.print(a[i] + " ");
System.out.println();
System.out.println();
System.out.println("Time Complexity in ms for
n=" + n + " is: " + (double) elapsedTime / 1000000);
}

public static void QuickSortAlgorithm(int p, int r) {


int i, j, temp, pivot;
if (p < r) {
i = p;
j = r + 1;
pivot = a[p]; // mark first element as pivot
while (true) {
i++;
while (a[i] < pivot && i < r)
i++;
j--;
while (a[j] > pivot)
j--;
if (i < j) {
temp = a[i];
a[i] = a[j];
a[j] = temp;
} else
break; // partition is over
}
a[p] = a[j];
a[j] = pivot;
QuickSortAlgorithm(p, j - 1);
QuickSortAlgorithm(j + 1, r);
}
}
}
Program 2: Merge Sort

2. 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 on graph sheet. The elements can be read
from a file or can be generated using the random number generator. Demonstrate using
Java how the divide-and-conquer method works along with its time complexity analysis:
worst case, average case and best case.

import java.util.Random;
import java.util.Scanner;

public class MergeSort2 {


static final int MAX = 10005;
static int[] a = new int[MAX];

public static void main(String[] args) {


Scanner input = new Scanner(System.in);
System.out.println("Enter Max array size: ");
int n = input.nextInt();
Random random = new Random();
//System.out.println("Enter the array elements: ");
for (int i = 0; i < n; i++)
// a[i] = input.nextInt(); // for keyboard entry
a[i] = random.nextInt(1000);//generate random number
long startTime = System.nanoTime();
MergeSortAlgorithm(0, n - 1);
long stopTime = System.nanoTime();
long elapsedTime = stopTime - startTime;
System.out.println("Time Complexity (ms) for n = " +
n + " is : " + (double) elapsedTime / 1000000);
System.out.println("Sorted Array (Merge Sort):");
for (int i = 0; i < n; i++)
System.out.println(a[i] + " ");
input.close();
}

public static void MergeSortAlgorithm(int low, int high) {


int mid;
if (low < high) {
mid = (low + high) / 2;
MergeSortAlgorithm(low, mid);
MergeSortAlgorithm(mid + 1, high);
Merge(low, mid, high);
}
}

public static void Merge(int low, int mid, int high) {


int[] b = new int[MAX];
int i, h, j, k;
h = i = low;
j = mid + 1;
while ((h <= mid) && (j <= high))
if (a[h] < a[j])
b[i++] = a[h++];
else
b[i++] = a[j++];

if (h > mid)
for (k = j; k <= high; k++)
b[i++] = a[k];
else
for (k = h; k <= mid; k++)
b[i++] = a[k];

for (k = low; k <= high; k++)


a[k] = b[k];
}
}
Module 3
Program 1: Knapsack Greedy

1. To solve Knapsack problem using Greedy method.

import java.util.Scanner;
class KObject { // Knapsack object details
float w;
float p;
float r;
}
public class KnapsackGreedy2 {
static final int MAX = 20; // max. no. of objects
static int n; // no. of objects
static float M; // capacity of Knapsack

public static void main(String args[]) {


Scanner scanner = new Scanner(System.in);
System.out.println("Enter number of objects: ");
n = scanner.nextInt();
KObject[] obj = new KObject[n];
for(int i = 0; i<n;i++)
obj[i] = new KObject();// allocate memory formembers

ReadObjects(obj);
Knapsack(obj);
scanner.close();
}

static void ReadObjects(KObject obj[]) {


KObject temp = new KObject();
Scanner scanner = new Scanner(System.in);
System.out.println("Enter the max capacity of knapsack: ");
M = scanner.nextFloat();

System.out.println("Enter Weights: ");


for (int i = 0; i < n; i++)
obj[i].w = scanner.nextFloat();

System.out.println("Enter Profits: ");


for (int i = 0; i < n; i++)
obj[i].p = scanner.nextFloat();

for (int i = 0; i < n; i++)


obj[i].r = obj[i].p / obj[i].w;

// sort objects in descending order, based on p/w ratio


for(int i = 0; i<n-1; i++)
for(int j=0; j<n-1-i; j++)
if(obj[j].r < obj[j+1].r){
temp = obj[j];
obj[j] = obj[j+1];
obj[j+1] = temp;
}
scanner.close();
}

static void Knapsack(KObject kobj[]) {


float x[] = new float[MAX];
float totalprofit;
int i;
float U; // U place holder for M
U = M;
totalprofit = 0;
for (i = 0; i < n; i++)
x[i] = 0;
for (i = 0; i < n; i++) {
if (kobj[i].w > U)
break;
else {
x[i] = 1;
totalprofit = totalprofit + kobj[i].p;
U = U - kobj[i].w;
}
}
System.out.println("i = " + i);
if (i < n)
x[i] = U / kobj[i].w;
totalprofit = totalprofit + (x[i] * kobj[i].p);
System.out.println("The Solution vector, x[]: ");
for (i = 0; i < n; i++)
System.out.print(x[i] + " ");
System.out.println("\nTotal profit is = " + totalprofit);
}
}
Program 2 : Dijikstra's

2. To find shortest paths to other vertices from a given vertex in a weighted


connected graph, using Dijkstra's algorithm.

import java.util.*;

public class DijkstrasClass {

final static int MAX = 20;


final static int infinity = 9999;
static int n; // No. of vertices of G
static int a[][]; // Cost matrix
static Scanner scan = new Scanner(System.in);

public static void main(String[] args) {


ReadMatrix();
int s = 0; // starting vertex
System.out.println("Enter starting vertex: ");
s = scan.nextInt();
Dijkstras(s); // find shortest path
}

static void ReadMatrix() {


a = new int[MAX][MAX];
System.out.println("Enter the number of vertices:");
n = scan.nextInt();
System.out.println("Enter the cost adjacency matrix:");
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
a[i][j] = scan.nextInt();
}

static void Dijkstras(int s) {


int S[] = new int[MAX];
int d[] = new int[MAX];
int u, v;
int i;
for (i = 1; i <= n; i++) {
S[i] = 0;
d[i] = a[s][i];
}
S[s] = 1;
d[s] = 1;
i = 2;
while (i <= n) {
u = Extract_Min(S, d);
S[u] = 1;
i++;
for (v = 1; v <= n; v++) {
if (((d[u] + a[u][v] < d[v]) && (S[v] == 0)))
d[v] = d[u] + a[u][v];
}
}
for (i = 1; i <= n; i++)
if (i != s)
System.out.println(i + ":" + d[i]);
}

static int Extract_Min(int S[], int d[]) {


int i, j = 1, min;
min = infinity;
for (i = 1; i <= n; i++) {
if ((d[i] < min) && (S[i] == 0)) {
min = d[i];
j = i;
}
}
return (j);
}
}
Program 3: Kruskals

3. To find Minimum Cost Spanning Tree of a given connected undirected


graph using Kruskal's algorithm. Use Union-Find algorithms in your
program.

import java.util.Scanner;

public class KruskalsClass {

final static int MAX = 20;


static int n; // No. of vertices of G
static int cost[][]; // Cost matrix
static Scanner scan = new Scanner(System.in);

public static void main(String[] args) {


ReadMatrix();
Kruskals();
}

static void ReadMatrix() {

int i, j;
cost = new int[MAX][MAX];

System.out.println("Implementation of Kruskal's algorithm");


System.out.println("Enter the no. of vertices");
n = scan.nextInt();

System.out.println("Enter the cost adjacency matrix");


for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
cost[i][j] = scan.nextInt();
if (cost[i][j] == 0)
cost[i][j] = 999;
}
}
}

static void Kruskals() {

int a = 0, b = 0, u = 0, v = 0, i, j, ne = 1, min, mincost = 0;

System.out.println("The edges of Minimum Cost Spanning Tree are");


while (ne < n) {
for (i = 1, min = 999; i <= n; i++) {
for (j = 1; j <= n; j++) {
if (cost[i][j] < min) {
min = cost[i][j];
a = u = i;
b = v = j;
}
}
}
u = find(u);
v = find(v);
if (u != v) {
uni(u, v);
System.out.println(ne++ + "edge (" + a + "," + b + ") =" + min);
mincost += min;
}
cost[a][b] = cost[b][a] = 999;
}
System.out.println("Minimum cost :" + mincost);
}
static int find(int i) {
int parent[] = new int[9];
while (parent[i] == 1)
i = parent[i];
return i;
}

static void uni(int i, int j) {


int parent[] = new int[9];
parent[j] = i;
}
}
Program 4: Prim's

4. To find Minimum Cost Spanning Tree of a given connected undirected


graph using Prim's algorithm.

import java.util.Scanner;

public class PrimsClass {

final static int MAX = 20;


static int n; // No. of vertices of G
static int cost[][]; // Cost matrix
static Scanner scan = new Scanner(System.in);

public static void main(String[] args) {


ReadMatrix();
Prims();
}

static void ReadMatrix() {


int i, j;
cost = new int[MAX][MAX];

System.out.println("\n Enter the number of nodes:");


n = scan.nextInt();
System.out.println("\n Enter the adjacency matrix:\n");
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++) {
cost[i][j] = scan.nextInt();
if (cost[i][j] == 0)
cost[i][j] = 999;
}
}

static void Prims() {

int visited[] = new int[10];


int ne = 1, i, j, min, a = 0, b = 0, u = 0, v = 0;
int mincost = 0;

visited[1] = 1;
while (ne < n) {
for (i = 1, min = 999; i <= n; i++)
for (j = 1; j <= n; j++)
if (cost[i][j] < min)
if (visited[i] != 0) {
min = cost[i][j];
a = u = i;
b = v = j;
}
if (visited[u] == 0 || visited[v] == 0) {
System.out.println("Edge" + ne++ + ":(" + a + "," + b + ")" +
"cost:" + min);
mincost += min;
visited[b] = 1;
}
cost[a][b] = cost[b][a] = 999;
}
System.out.println("\n Minimun cost" + mincost);
}

}
Module 4
Program 1: Floyd's

1. Solve All-Pairs Shortest Paths problem using Floyd's algorithm.


import java.util.Scanner;
public class FloydsClass {
static final int MAX = 20; // max. size of cost matrix
static int a[][]; // cost matrix
static int n; // actual matrix size

public static void main(String args[]) {


a = new int[MAX][MAX];
ReadMatrix();
Floyds(); // find all pairs shortest path
PrintMatrix();
}

static void ReadMatrix() {


System.out.println("Enter the number of vertices\n");
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
System.out.println("Enter the Cost Matrix (999 for infinity) \n");
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
a[i][j] = scanner.nextInt();
}
}
scanner.close();
}

static void Floyds() {


for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if ((a[i][k] + a[k][j]) < a[i][j])
a[i][j] = a[i][k] + a[k][j];
}
}

static void PrintMatrix() {


System.out.println("The All Pair Shortest Path Matrix is:\n");
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
System.out.print(a[i][j] + "\t");
System.out.println("\n");
}
}
}
Program 2: TSP – DP

2. Solve Travelling Sales Person problem using Dynamic programming.

import java.util.Scanner;

public class TravSalesPerson {


static int MAX = 100;
static final int infinity = 999;

public static void main(String args[]) {


int cost = infinity;
int c[][] = new int[MAX][MAX]; // cost matrix
int tour[] = new int[MAX]; // optimal tour
int n; // max. cities
System.out.println("Travelling Salesman Problem using
Dynamic Programming\n");
System.out.println("Enter number of cities: ");
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
System.out.println("Enter Cost matrix:\n");
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
c[i][j] = scanner.nextInt();
if (c[i][j] == 0)
c[i][j] = 999;
}
for (int i = 0; i < n; i++)
tour[i] = i;
cost = tspdp(c, tour, 0, n);
// print tour cost and tour
System.out.println("Minimum Tour Cost: " + cost);
System.out.println("\nTour:");
for (int i = 0; i < n; i++) {
System.out.print(tour[i] + " -> ");
}
System.out.println(tour[0] + "\n");
scanner.close();
}

static int tspdp(int c[][], int tour[], int start, int n) {


int i, j, k;
int temp[] = new int[MAX];
int mintour[] = new int[MAX];
int mincost;
int cost;
if (start == n - 2)
return c[tour[n - 2]][tour[n - 1]] + c[tour[n
- 1]][0];
mincost = infinity;
for (i = start + 1; i < n; i++) {
for (j = 0; j < n; j++)
temp[j] = tour[j];
temp[start + 1] = tour[i];
temp[i] = tour[start + 1];
if (c[tour[start]][tour[i]] + (cost = tspdp(c,
temp, start + 1, n)) < mincost) {
mincost = c[tour[start]][tour[i]] + cost;
for (k = 0; k < n; k++)
mintour[k] = temp[k];
}
}
for (i = 0; i < n; i++)
tour[i] = mintour[i];
return mincost;
}
}
Module 5
Program 1: Sum-of-Subset
1. Design and implement C++/Java 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. For example, if S = {1, 2, 5, 6, 8} and d= 9, there are two solutions {1,
2, 6} and {1, 8}. Display a suitable message, if the given problem instance doesn't
have a solution.
import java.util.Scanner;

public class SumOfsubset {


final static int MAX = 10;
static int n;
static int S[];
static int soln[];
static int d;

public static void main(String args[]) {


S = new int[MAX];
soln = new int[MAX];
int sum = 0;
Scanner scanner = new Scanner(System.in);
System.out.println("Enter number of elements: ");
n = scanner.nextInt();

System.out.println("Enter the set in increasing order: ");


for (int i = 1; i <= n; i++)
S[i] = scanner.nextInt();
System.out.println("Enter the max. subset value(d): ");
d = scanner.nextInt();
for (int i = 1; i <= n; i++)
sum = sum + S[i];
if (sum < d || S[1] > d)
System.out.println("No Subset possible");
else
SumofSub(0, 0, sum);
scanner.close();
}

static void SumofSub(int i, int weight, int total) {


if (promising(i, weight, total) == true)
if (weight == d) {
for (int j = 1; j <= i; j++) {
if (soln[j] == 1)
System.out.print(S[j] + " ");
}
System.out.println();
}
else {
soln[i + 1] = 1;
SumofSub(i + 1, weight + S[i + 1], total - S[i + 1]);
soln[i + 1] = 0;
SumofSub(i + 1, weight, total - S[i + 1]);
}
}

static boolean promising(int i, int weight, int total) {


return ((weight + total >= d) && (weight == d || weight +
S[i + 1] <= d));
}
}
Program 2: Hamiltonian cycle

2. Design and implement C++/Java Program to find all Hamiltonian Cycles in


a connected undirected Graph G of n vertices using backtracking principle.

import java.util.Scanner;

public class Hamiltonian {


boolean found = false;
int G[][];// = new int[n + 1][n + 1];
int x[];// = new int[n + 1];
int n;

public static void main(String args[]) {


Hamiltonian hamiltonian = new Hamiltonian();
hamiltonian.getData();
System.out.println("\nSolution:");
hamiltonian.HamiltonianMethod(2);
hamiltonian.printNoSlnPossible();

public void printNoSlnPossible() {


if (found == false)
System.out.println("No Solution possible!");
}

public void getData() {


Scanner scanner = new Scanner(System.in);
System.out.println("\t\t\t\tHamiltonian Cycle");
System.out.print("\nEnter the number of the vertices: ");
// int n;
n = scanner.nextInt();
G = new int[n + 1][n + 1];
x = new int[n + 1];
System.out.print("\nIf edge between the following vertices enter 1 else 0:\n");
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++) {
if ((i != j) && (i < j)) {
System.out.print(i + " and " + j + ": ");
G[j][i] = G[i][j] = scanner.nextInt();
}
if (i == j)
G[i][j] = 0;
}
for (int i = 1; i <= n; i++)
x[i] = 0;
x[1] = 1;

scanner.close();
}

void HamiltonianMethod(int k) {
while (true) {
NextValue(k, G, x, n);
if (x[k] == 0)
return;
if (k == n) {
for (int i = 1; i <= k; i++)
System.out.print(x[i] + " ");
System.out.println(x[1]);
System.out.println();
found = true;
return;
}
else
HamiltonianMethod(k + 1);
}
}

void NextValue(int k, int G[][], int x[], int n) {


while (true) {
x[k] = (x[k] + 1) % (n + 1);
if (x[k] == 0)
return;
if (G[x[k - 1]][x[k]] != 0) {
int j;
for (j = 1; j < k; j++)
if (x[k] == x[j])
break;
if (j == k)
if ((k < n) || ((k == n) && G[x[n]][x[1]] != 0))
return;
}
}
}
}

You might also like