Merge Sort
class MergeSort {
int arr[] = {17, 2, 15, 21, 8, 1};
void sort(int l, int r) {
if (l < r) {
int mid = (l+r) / 2;
sort(l, mid);
sort(mid+1, r);
merge(l, mid, r);
}
}
void merge(int l, int mid, int r) {
int n1 = mid - l + 1;
int n2 = r - mid;
int L[] = new int[n1];
int R[] = new int[n2];
for (int i = 0; i < n1; i++)
L[i] = arr[l+i];
for (int j = 0; j < n2; j++)
R[j] = arr[mid + 1 + j];
int i = 0, j = 0, k = l;
while( i < n1 && j < n2) {
if (L[i] < R[j]) {
arr[k] = L[i];
i++;
} else {
arr[k] = R[j];
j++;
}
k++;
}
while(i < n1) {
arr[k] = L[i];
i++;
k++;
}
while(j < n2) {
arr[k] = R[j];
j++;
k++;
}
}
void print() {
System.out.println("Elements of array:");
for (int i = 0; i < arr.length; i++)
System.out.println(arr[i]);
}
public static void main(String args[]) {
MergeSort s = new MergeSort();
s.sort(0, s.arr.length-1);
s.print();
}
}
Quick Sort
class QuickSort {
int arr[] = {17, 2, 15, 21, 8, 1};
void swap(int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
int partition(int l, int r) {
int pivot = arr[r];
int p = l - 1;
for (int i = l; i < r; i++) {
if (arr[i] <= pivot) {
p++;
swap(p, i);
}
}
swap(p+1, r);
return p+1;
}
void sort(int l, int r) {
if (l < r) {
int p = partition(l, r);
sort(l, p-1);
sort(p+1, r);
}
}
void print() {
System.out.println("Elements of array:");
for (int i = 0; i < arr.length; i++)
System.out.println(arr[i]);
}
public static void main(String args[]) {
QuickSort s = new QuickSort();
s.sort(0, s.arr.length-1);
s.print();
}
}
Depth First Search
import java.util.InputMismatchException;
import java.util.Scanner;
import java.util.Stack;
public class DFS
{
private Stack<Integer> stack;
public DFS()
{
stack = new Stack<Integer>();
}
public void dfs(int adjacency_matrix[][], int source)
{
int number_of_nodes = adjacency_matrix[source].length - 1;
int visited[] = new int[number_of_nodes + 1];
int element = source;
int i = source;
System.out.print(element + "\t");
visited[source] = 1;
stack.push(source);
while (!stack.isEmpty())
{
element = stack.peek();
i = element;
while (i <= number_of_nodes)
{
if (adjacency_matrix[element][i] == 1 && visited[i] == 0)
{
stack.push(i);
visited[i] = 1;
element = i;
i = 1;
System.out.print(element + "\t");
continue;
}
i++;
}
stack.pop();
}
}
public static void main(String...arg)
{
int number_of_nodes, source;
Scanner scanner = null;
try
{
System.out.println("Enter the number of nodes in the graph");
scanner = new Scanner(System.in);
number_of_nodes = scanner.nextInt();
int adjacency_matrix[][] = new int[number_of_nodes + 1][number_of_nodes + 1];
System.out.println("Enter the adjacency matrix");
for (int i = 1; i <= number_of_nodes; i++)
for (int j = 1; j <= number_of_nodes; j++)
adjacency_matrix[i][j] = scanner.nextInt();
System.out.println("Enter the source for the graph");
source = scanner.nextInt();
System.out.println("The DFS Traversal for the graph is given by ");
DFS dfs = new DFS();
dfs.dfs(adjacency_matrix, source);
}catch(InputMismatchException inputMismatch)
{
System.out.println("Wrong Input format");
}
scanner.close();
}
}
Output
Enter the number of nodes in the graph
4
Enter the adjacency matrix
0 1 0 1
0 0 1 0
0 1 0 1
0 0 0 1
Enter the source for the graph
1
The DFS Traversal for the graph is given by
1 2 3 4
Breadth First Search
import java.util.InputMismatchException;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class BFS
{
private Queue<Integer> queue;
public BFS()
{
queue = new LinkedList<Integer>();
}
public void bfs(int adjacency_matrix[][], int source)
{
int number_of_nodes = adjacency_matrix[source].length - 1;
int[] visited = new int[number_of_nodes + 1];
int i, element;
visited[source] = 1;
queue.add(source);
while (!queue.isEmpty())
{
element = queue.remove();
i = element;
System.out.print(i + "\t");
while (i <= number_of_nodes)
{
if (adjacency_matrix[element][i] == 1 && visited[i] == 0)
{
queue.add(i);
visited[i] = 1;
}
i++;
}
}
}
public static void main(String... arg)
{
int number_no_nodes, source;
Scanner scanner = null;
try
{
System.out.println("Enter the number of nodes in the graph");
scanner = new Scanner(System.in);
number_no_nodes = scanner.nextInt();
int adjacency_matrix[][] = new int[number_no_nodes + 1][number_no_nodes + 1];
System.out.println("Enter the adjacency matrix");
for (int i = 1; i <= number_no_nodes; i++)
for (int j = 1; j <= number_no_nodes; j++)
adjacency_matrix[i][j] = scanner.nextInt();
System.out.println("Enter the source for the graph");
source = scanner.nextInt();
System.out.println("The BFS traversal of the graph is ");
BFS bfs = new BFS();
bfs.bfs(adjacency_matrix, source);
} catch (InputMismatchException inputMismatch)
{
System.out.println("Wrong Input Format");
}
scanner.close();
}
}
Output
Enter the number of nodes in the graph
4
Enter the adjacency matrix
0 1 0 1
0 0 1 0
0 1 0 1
0 0 0 1
Enter the source for the graph
1
The DFS Traversal for the graph is given by
1 2 3 4
Job Sequencing
import java.util.*;
public class Job
{
public static void main(String args[])
{
Scanner sc=new Scanner(System.in);
System.out.println("Enter the number of Jobs");
int n=sc.nextInt();
String a[]=new String[n];
int b[]=new int[n];
int c[]=new int[n];
for(int i=0;i<n;i++)
{
System.out.println("Enter the Jobs");
a[i]=sc.next();
System.out.println("Enter the Profit");
b[i]=sc.nextInt();
System.out.println("Enter the DeadLine");
c[i]=sc.nextInt();
}
System.out.println("--Arranged Order--\nJobs: ");
for(int i=0;i<n;i++)
{
System.out.print(a[i]+" ");
}
System.out.print("\nProfit: ");
for(int i=0;i<n;i++)
{
System.out.print(b[i]+" ");
}
System.out.print("\nDeadLine:");
for(int i=0;i<n;i++)
{
System.out.print(c[i]+" ");
}
for(int i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++)
{
if(b[i]<b[j])
{
int temp=b[i];
b[i]=b[j];
b[j]=temp;
temp=c[i];
c[i]=c[j];
c[j]=temp;
String temp1=a[i];
a[i]=a[j];
a[j]=temp1;
}
}
}
System.out.println("\n--Sorted Order--\nJobs: ");
for(int i=0;i<n;i++)
{
System.out.print(a[i]+" ");
}
System.out.print("\nProfit: ");
for(int i=0;i<n;i++)
{
System.out.print(b[i]+" ");
}
System.out.print("\nDeadLine:");
for(int i=0;i<n;i++)
{
System.out.print(c[i]+" ");
}
System.out.println();
int max=c[0];
for(int i=0;i<n;i++)
{
if(c[i]>max)
{
max=c[i];
}
}
String x[]=new String[max];
int xx[]=new int[max];
int profit=0;
for(int i=0;i<n;i++)
{
int pp=c[i];
pp=pp-1;
if(x[pp]==null )
{
x[pp]=a[i];
profit+=b[i];
}
else
{
while(pp!=-1)
{
if(x[pp]==null)
{
x[pp]=a[i];
profit+=b[i];
break;
}
pp=pp-1;
}
}
}
for(int i=0;i<max;i++)
{
System.out.print("-->"+x[i]);
}
System.out.print("\nProfit Earned"+profit);
}
}
Kruskal’s
import java.util.*;
import java.util.Scanner;
class Graph {
class Edge implements Comparable<Edge> {
int src, dst, weight;
public int compareTo(Edge another) {
return this.weight - another.weight;
}
};
// Union
class subset {
int parent, rank;
}
int vertices, edges;
Edge edge[];
Graph (int v, int e) {
vertices = v;
edges = e;
edge = new Edge[edges];
for (int i = 0; i < e; i++)
edge[i] = new Edge();
}
int find (subset s[], int i) {
if (s[i].parent != i)
s[i].parent = find(s, s[i].parent);
return s[i].parent;
}
void Union (subset s[], int x, int y) {
int xroot = find(s, x);
int yroot = find(s, y);
if (s[xroot].rank < s[yroot].rank)
s[xroot].parent = yroot;
else if (s[xroot].rank > s[yroot].rank)
s[yroot].parent = xroot;
else {
s[yroot].parent = xroot;
s[xroot].rank++;
}
}
void Kruskal() {
Edge result[] = new Edge[vertices];
int i = 0, e = 0;
for (i = 0; i < vertices; i++)
result[i] = new Edge();
Arrays.sort(edge);
subset[] s = new subset[vertices];
for (i = 0; i < vertices; i++) {
s[i] = new subset();
s[i].parent = i;
s[i].rank = 0;
}
i = 0;
while (e < vertices - 1 && i < edges) {
Edge nextEdge = new Edge();
nextEdge = edge[i++];
int x = find(s, nextEdge.src);
int y = find(s, nextEdge.dst);
if (x != y) {
result[e++] = nextEdge;
Union(s, x, y);
}
}
for (i = 0; i < e; ++i)
System.out.println(result[i].src + " - " + result[i].dst + ": " + result[i].weight);
}
public static void main(String[] args) {
int vertices = 6; // Number of vertices
int edges = 8; // Number of edges
Graph G = new Graph(vertices, edges);
G.edge[0].src = 0;
G.edge[0].dst = 1;
G.edge[0].weight = 4;
G.edge[1].src = 0;
G.edge[1].dst = 2;
G.edge[1].weight = 4;
G.edge[2].src = 1;
G.edge[2].dst = 2;
G.edge[2].weight = 2;
G.edge[3].src = 2;
G.edge[3].dst = 3;
G.edge[3].weight = 3;
G.edge[4].src = 2;
G.edge[4].dst = 5;
G.edge[4].weight = 2;
G.edge[5].src = 2;
G.edge[5].dst = 4;
G.edge[5].weight = 4;
G.edge[6].src = 3;
G.edge[6].dst = 4;
G.edge[6].weight = 3;
G.edge[7].src = 5;
G.edge[7].dst = 4;
G.edge[7].weight = 3;
G.Kruskal();
}
}
Prim’s Algorithm
import java.util.Arrays;
class Prims {
public void Prim(int G[][], int V) {
int edges = 0;
boolean[] selected = new boolean[V];
Arrays.fill(selected, false);
selected[0] = true;
System.out.println("Edge : Weight");
while (edges < V - 1) {
int min = Integer.MAX_VALUE, x = 0, y = 0;
for (int i = 0; i < V; i++) {
if (selected[i]) {
for (int j = 0; j < V; j++) {
if (!selected[j] && G[i][j] != 0) {
if (min > G[i][j]) {
min = G[i][j];
x = i;
y = j;
}
}
}
}
}
System.out.println(x + " - " + y + " : " + G[x][y]);
selected[y] = true;
edges++;
}
}
public static void main(String[] args) {
Prims g = new Prims();
int V = 5;
int[][] G = { { 0, 9, 75, 0, 0 },
{ 9, 0, 95, 19, 42 },
{ 75, 95, 0, 51, 66 },
{ 0, 19, 51, 0, 31 },
{ 0, 42, 66, 31, 0 } };
g.Prim(G, V);
}
}
Knapsack Problem
import java.util.Arrays;
class Knapsack {
int[] solve(int[] price, int[] weight, int max) {
int arr[][] = new int[price.length+1][max+1];
Arrays.fill(arr[0], 0);
for (int i = 0; i < arr.length; i++)
arr[i][0] = 0;
for (int i = 1; i < arr.length; i++) {
for (int j = 1; j < arr[0].length; j++) {
if (j - weight[i-1] < 0 || j - weight[i-1] > max)
arr[i][j] = arr[i-1][j];
else
arr[i][j] = Math.max(arr[i-1][j], (arr[i-1][j-weight[i-1]] + price[i-1]));
}
}
int[] ans = new int[price.length];
Arrays.fill(ans, 0);
int tmp = arr[price.length][max];
for (int i = arr.length - 2; i > 0; i--) {
for (int j = arr[0].length - 1; j > 0; j--) {
if (arr[i][j] == tmp)
break;
if (arr[i][j] < tmp) {
ans[i] = 1;
tmp -= price[i]; break;
}
}
}
return ans;
}
public static void main(String args[]) {
Knapsack k = new Knapsack();
int[] weight = {2, 3, 4, 5};
int[] price = {1, 2, 5, 6};
int max = 8;
int ans[] = k.solve(price, weight, max);
for (int i = 0; i < ans.length; i++) {
if (ans[i] == 1)
System.out.println(weight[i]);
}
}
}
Optimal Binary Search Tree
import java.util.*;
class OptimalBST {
int[][] cost;
int Sum(int freq[], int i, int j) {
int s = 0;
for (int k = i; k <= j; k++)
s += freq[k];
return s;
}
int cache(int freq[], int i, int j) {
if (i < 0 || j < 0)
return 0;
if (cost[i][j] != 0)
return cost[i][j];
int sum = Sum(freq, i, j);
int Min = Integer.MAX_VALUE;
for (int r = i; r <= j; r++) {
int c = cache(freq, i, r-1) + cache(freq, r + 1, j)+sum;
if (c < Min) {
Min = c;
cost[i][j] = c;
}
}
return cost[i][j];
}
int solve(int keys[], int freq[], int n) {
cost = new int[n+1][n+1];
for (int i = 0; i < n; i++)
Arrays.fill(cost[i], 0);
for (int i = 0; i < n; i++)
cost[i][i] = freq[i];
return cache(freq, 0, n - 1);
}
public static void main(String[] args) {
int keys[] = { 10, 12, 20 };
int freq[] = { 34, 8, 50 };
int n = keys.length;
OptimalBST t = new OptimalBST();
System.out.println( "Cost of Optimal BST is " + t.solve(keys, freq, n));
}
}
All path Shortest (Floyd)
class FloydWarshall {
void solve(int arr[][]) {
int A = 0;
while (A < arr.length) {
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[0].length; j++) {
if (i != A && j != A && i != j) {
if (arr[i][j] == 0)
arr[i][j] = arr[i][A] + arr[A][j];
else
arr[i][j] = Math.min(arr[i][j], (arr[i][A] + arr[A][j]));
}
}
}
A++;
}
}
public static void main(String args[]) {
int[][] arr = {{0, 3, 0, 7},
{8, 0, 2, 0},
{5, 0, 0, 1},
{2, 0, 0, 0}};
FloydWarshall f = new FloydWarshall();
f.solve(arr);
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[0].length; j++)
System.out.print(arr[i][j]);
System.out.println();
}
}
}
NQueen Problem
import java.util.Arrays;
class NQueen {
int[][] board;
void solve(int n) {
board = new int[n][n];
for (int i=0; i < n; i++)
Arrays.fill(board[i], 0);
if (backTrack(0)) {
for (int i = 0; i < n; i++) {
for (int j =0; j < n; j++)
System.out.print(board[i][j]);
System.out.println();
}
}
}
boolean backTrack(int row) {
if (row >= board.length)
return true;
for (int j = 0; j < board.length; j++) {
if (isSafe(row, j)) {
board[row][j] = 1;
if (backTrack(row+1) == true)
return true;
board[row][j] = 0;
}
}
return false;
}
boolean isSafe(int row, int col) {
int i, j;
for (i = 0; i < board.length; i++)
if (board[i][col] == 1)
return false;
for (i = row-1, j = col-1; i>=0 && j>=0; i--,j--)
if (board[i][j] == 1)
return false;
for (i = row-1, j = col+1; i >=0 && j < board.length; i--,j++)
if (board[i][j] == 1)
return false;
return true;
}
public static void main(String args[]) {
NQueen b = new NQueen();
b.solve(4);
}
}
Sum of Subsets
import java.util.Scanner;
public class SumOfSubsets {
int[] w;
int[] x;
int sum;
public void process() {
getData();
}
private void getData() {
Scanner sc = new Scanner(System.in);
System.out.print("Enter the number of elements:");
int n = sc.nextInt();
w = new int[n + 1];
x = new int[n + 1];
int total = 0;
System.out.println("Enter " + n + " Elements :");
for (int i = 1; i < n + 1; i++) {
w[i] = sc.nextInt();
total += w[i];
}
System.out.println("Enter the sum to be obtained: ");
sum = sc.nextInt();
if (total < sum) {
System.out.println("Not possible to obtain the subset!!!");
System.exit(1);
}
subset(0, 1, total);
}
private void subset(int s, int k, int r) {
int i = 0;
x[k] = 1;
if (s + w[k] == sum) {
System.out.println();
for (i = 1; i <= k; i++) {
System.out.print("\t" + x[i]);
}
} else if ((s + w[k] + w[k + 1]) <= sum) {
subset(s + w[k], k + 1, r - w[k]);
}
if ((s + r - w[k]) >= sum && (s + w[k + 1]) <= sum) {
x[k] = 0;
subset(s, k + 1, r - w[k]);
}
}
public static void main(String[] args) {
new SumOfSubsets().process();
}
}
Output
Enter the number of elements:4
Enter 4 Elements :
7
11
13
24
Enter the sum to be obtained:
31
1 1 1
1 0 0 1
Hamilton Problem
import java.util.Scanner;
import java.util.Arrays;
public class HamiltonianCycle {
private int V, pathCount;
private int[] path;
private int[][] graph;
public void findHamiltonianCycle(int[][] g) {
V = g.length;
path = new int[V];
Arrays.fill(path, -1);
graph = g;
try {
path[0] = 0;
pathCount = 1;
solve(0);
System.out.println("No solution");
} catch (Exception e) {
System.out.println(e.getMessage());
display();
}
}
public void solve(int vertex) throws Exception {
if (graph[vertex][0] == 1 && pathCount == V)
throw new Exception("Solution found");
if (pathCount == V)
return;
for (int v = 0; v < V; v++) {
if (graph[vertex][v] == 1 ) {
path[pathCount++] = v;
graph[vertex][v] = 0;
graph[v][vertex] = 0;
if (!isPresent(v))
solve(v);
graph[vertex][v] = 1;
graph[v][vertex] = 1;
path[--pathCount] = -1;
}
}
}
public boolean isPresent(int v) {
for (int i = 0; i < pathCount - 1; i++)
if (path[i] == v)
return true;
return false;
}
public void display() {
System.out.print("\nPath : ");
for (int i = 0; i <= V; i++)
System.out.print(path[i % V] +" ");
System.out.println();
}
public static void main (String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("HamiltonianCycle Algorithm Test\n");
HamiltonianCycle hc = new HamiltonianCycle();
System.out.println("Enter number of vertices\n");
int V = scan.nextInt();
System.out.println("\nEnter matrix\n");
int[][] graph = new int[V][V];
for (int i = 0; i < V; i++)
for (int j = 0; j < V; j++)
graph[i][j] = scan.nextInt();
hc.findHamiltonianCycle(graph);
}
}
Graph Coloring
import java.util.Scanner;
public class GraphColoring
{
private int V, numOfColors;
private int[] color;
private int[][] graph;
public void graphColor(int[][] g, int noc)
{
V = g.length;
numOfColors = noc;
color = new int[V];
graph = g;
try
{
solve(0);
System.out.println("No solution");
}
catch (Exception e)
{
System.out.println("\nSolution exists ");
display();
}
}
public void solve(int v) throws Exception
{
if (v == V)
throw new Exception("Solution found");
for (int c = 1; c <= numOfColors; c++)
{
if (isPossible(v, c))
{
color[v] = c;
solve(v + 1);
color[v] = 0;
}
}
}
public boolean isPossible(int v, int c)
{
for (int i = 0; i < V; i++)
if (graph[v][i] == 1 && c == color[i])
return false;
return true;
}
public void display()
{
System.out.print("\nColors : ");
for (int i = 0; i < V; i++)
System.out.print(color[i] +" ");
System.out.println();
}
public static void main (String[] args)
{
Scanner scan = new Scanner(System.in);
System.out.println("Graph Coloring Algorithm Test\n");
GraphColoring gc = new GraphColoring();
System.out.println("Enter number of verticesz\n");
int V = scan.nextInt();
System.out.println("\nEnter matrix\n");
int[][] graph = new int[V][V];
for (int i = 0; i < V; i++)
for (int j = 0; j < V; j++)
graph[i][j] = scan.nextInt();
System.out.println("\nEnter number of colors");
int c = scan.nextInt();
gc.graphColor(graph, c);
}
}
Output
Graph Coloring Algorithm Test
Enter number of vertices
4
Enter matrix
1 0 1 0
0 0 0 1
1 1 1 0
1 0 0 1
Enter number of colors
2
Solution exists
Colors : 1 1 2 2