Insertion Sort
#include <stdio.h>
void main()
{
int n, i, j, key, a[100];
printf("Enter number of elements: ");
scanf("%d", &n);
printf("Enter elements of array\n");
for (i = 1; i <= n; i++)
{
scanf("%d\t", &a[i]);
}
for (j = 2; j <= n; j++)
{
key = a[j];
i = j-1;
while (i > 0 && a[i] > key)
{
a[i+1] = a[i];
i = i-1;
}
a[i+1] = key;
}
printf("Sorted list in ascending order:\n");
for (i = 1; i <= n; i++)
{
printf("%d\t", a[i]);
}
}
Selection Sort
#include <stdio.h>
void selectionSort(int a[], int n)
{
int i, j, min, temp;
for (i = 0 ; i < n-1 ;i++)
{
min = i;
for (j = i+1 ; j < n; j++)
{
if (a[j] < a[min])
{
min = j;
}
}
temp = a[i];
a[i] = a[min];
a[min] = temp;
}
}
void main()
{
int a[10], i, n;
printf("Enter number of elements in array: ");
scanf("%d", &n);
printf("Enter elements of array: \n");
for (i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
selectionSort(a, n);
printf("Sorted array is ");
for (i = 0; i < n;i++)
{
printf("%d ", a[i]);
}
}
Quick Sort
#include <stdio.h>
int partition(int a[], int low, int high)
{
int pivot = a[high]; //last element
int i = low - 1;
for (int j = low; j < high; j++)
{
if (a[j] < pivot)
{
i++;
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
int temp = a[i + 1]; // Place pivot in the correct position
a[i + 1] = a[high];
a[high] = temp;
return i + 1;
}
void quickSort(int a[], int low, int high)
{
if (low < high)
{
int pi = partition(a, low, high);
quickSort(a, low, pi - 1);
quickSort(a, pi + 1, high);
}
}
int main()
{
int n, i, a[100];
printf("Enter number of elements: ");
scanf("%d", &n);
printf("Enter elements of array\n");
for (i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
quickSort(a, 0, n - 1);
printf("Sorted array:\n");
for (i = 0; i < n; i++)
{
printf("%d\t", a[i]);
}
return 0;
}
Merge Sort
#include <stdio.h>
void combine(int a[], int low, int mid, int high)
{
int l1,l2,i,j,k;
l1 = mid - low + 1;
l2 = high - mid;
int left[l1], right[l2];
for(i = 0; i < l1; i++)
{
left[i] = a[low + i];
}
for(j = 0; j < l2; j++)
{
right[j] = a[mid + 1 + j];
}
i = 0, j = 0, k = low;
while (i < l1 && j < l2)
{
if(left[i] <= right[j])
{
a[k] = left[i];
i++;
}
else
{
a[k] = right[j];
j++;
}
k++;
}
while(i < l1)
{
a[k++] = left[i++];
}
while(j < l2)
{
a[k++] = right[j++];
}
}
void mergesort(int a[], int low, int high)
{
if(low < high)
{
int mid = (low + high) / 2;
mergesort(a, low, mid);
mergesort(a, mid+1, high);
combine(a, low, mid, high);
}
}
int main()
{
int n, i, a[100];
printf("Enter the number of elements : ");
scanf("%d", &n);
printf("Enter the elements of array : \n");
for(i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
mergesort(a, 0, n-1);
printf("\nSorted array : ");
for(i = 0; i < n; i++)
{
printf("%d\t", a[i]);
}
return 0;
}
Binary Search
#include <stdio.h>
int binarySearch(int a[], int low, int high, int x)
{
while (low <= high)
{
int mid = low + (high - low) / 2; // Prevent integer overflow
if (a[mid] == x)
{
return mid;
}
else if (a[mid] < x)
{
low = mid + 1;
}
else
{
high = mid - 1;
}
}
return -1;
}
void main()
{
int n, i, a[100], x;
printf("Enter the number of elements : ");
scanf("%d", &n);
printf("\nEnter the elements of sorted array : \n");
for(i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
printf("\nEnter the element to be search : ");
scanf("%d", &x);
int result = binarySearch(a, 0, n-1, x);
if(result == -1)
{
printf("\nElement is not present in array");
}
else
{
printf("Element is present at index %d (0-based index)",result);
}
}
void main()
{
int n, i, j, temp, a[100], x;
printf("Enter the number of elements : ");
scanf("%d", &n);
printf("\nEnter the elements of array : \n");
for(i=0; i < n; i++)
{
scanf("%d", &a[i]);
}
/* Bubble sorting begins */
for (i = 0; i < n; i++)
{
for (j = 0; j < (n - i - 1); j++)
{
if (a[j] > a[j + 1])
{
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
printf("Sorted array is...\n");
for (i = 0; i < n; i++)
{
printf("%d\t", a[i]);
}
printf("\nEnter the element to be search : ");
scanf("%d", &x);
int result = binarySearch(a, 0, n-1, x);
if(result == -1)
{
printf("\nElement is not present in array");
}
else
{
printf("Element is present at index %d",result);
}
}
Fractional Knapsack
#include<stdio.h>
int main()
{
float weight[50], profit[50], ratio[50], totalvalue = 0, capacity, temp;
int i, j, n;
printf("Enter number of items :");
scanf("%d", &n);
for(i = 0; i < n; i++)
{
printf("\nEnter weight and profit for item[%d] : ", i);
scanf("%f %f", &weight[i], &profit[i]);
}
printf("\nEnter the capacity of Knapsack : ");
scanf("%f", &capacity);
for(i = 0; i < n; i++)
{
ratio[i] = profit[i] / weight[i];
}
for(i = 0; i < n; i++)
{
for(j = i + 1; j < n; j++)
{
if(ratio[i] < ratio[j])
{
temp = ratio[j];
ratio[j] = ratio[i];
ratio[i] = temp;
temp = weight[j];
weight[j] = weight[i];
weight[i] =temp;
temp = profit[j];
profit[j] = profit [i];
profit[i] = temp;
}
}
}
for(i = 0; i < n; i++)
{
if(weight[i] > capacity)
{
break;
}
else
{
totalvalue = totalvalue + profit[i];
capacity = capacity - weight[i];
}
}
if(i < n)
{
totalvalue = totalvalue + (ratio[i] * capacity);
printf("Total profit : %f ", totalvalue);
}
return 0;
}
Enter number of items :5
Enter weight and profit for item[0] : 10 20
Enter weight and profit for item[1] : 20 30
Enter weight and profit for item[2] : 30 40
Enter weight and profit for item[3] : 40 50
Enter weight and profit for item[4] : 50 60
Enter the capacity of Knapsack : 70
Total profit : 102.500000
Prim
# include<stdio.h>
# include <limits.h>
#define MAX 50
int n, i, j, k, G[MAX][MAX], select[MAX], min_dist, cost = 0, u, v;
void Prim()
{
// Initialize the select array to 0
for (int i = 0; i < n; i++)
{
select[i] = 0;
}
select[0] = 1; // Start with the first node
printf("\nMinimum Spanning Tree Edges is:\n");
for (k = 1 ; k < n ; k++)
{
min_dist = INT_MAX; // Set min_dist to infinity
for (i = 0 ; i < n ; i++)
for (j = 0 ; j < n ; j++)
if (G[i][j] && ((select[i] && !select[j]) || (!select[i] &&
select[j])))
if (G[i][j] < min_dist)
{
min_dist = G[i][j];
u = i;
v = j;
}
printf("\n Edge (%d %d) and weight = %d",u,v,min_dist);
select[u] = select[v] = 1; // Mark the node as selected
cost = cost + min_dist;
}
printf("\n\n\t Total Path Length Is = %d",cost);
}
int main()
{
printf("Enter Number of Nodes in The Graph: ");
scanf("%d",&n);
printf("Enter the adjacency matrix (0 for no edge):\n");
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
printf("G[%d][%d]: ",i,j);
scanf("%d",&G[i][j]);
}
}
Prim();
return 0;
}
0 → 1 → 2 → 0 (circular/triangular) Prim
1 1 2
Enter Number of Nodes in The Graph: 3
Enter the adjacency matrix (0 for no edge):
G[0][0]: 0
G[0][1]: 1
G[0][2]: 2
G[1][0]: 1
G[1][1]: 0
G[1][2]: 1
G[2][0]: 2
G[2][1]: 1
G[2][2]: 0
Minimum Spanning Tree Edges is:
Edge (0 1) and weight = 1
Edge (1 2) and weight = 1
Total Path Length Is = 2
1→ 2 → 3 → 1 (circular/triangular)
1 1 2
Enter the no. of vertices:3 Kruskal
Enter the cost adjacency matrix (use 0 for no edge):
cost[1][1]: 0
cost[1][2]: 1
cost[1][3]: 2
cost[2][1]: 1
cost[2][2]: 0
cost[2][3]: 1
cost[3][1]: 2
cost[3][2]: 1
cost[3][3]: 0
The edges of Minimum Cost Spanning Tree are
Edge (1, 2) with weight 1
Edge (2, 3) with weight 1
Minimum cost = 2
Kruskal
#include<stdio.h>
#include <limits.h> // For INT_MAX
#define MAX 50
int i, j, a, b, u, v, n;
int min, mincost = 0, cost[MAX][MAX], parent[MAX], edges = 0;
//find root of a vertex
int find(int i)
{
while(parent[i])
i = parent[i];
return i;
}
//perform union of two sets
int uni(int i, int j)
{
if(i != j)
{
parent[j] = i;
return 1;
}
return 0;
}
int main()
{
printf("Enter the no. of vertices:");
scanf("%d", &n);
printf("Enter the cost adjacency matrix (use 0 for no edge):\n");
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
printf("cost[%d][%d]: ", i, j);
scanf("%d", &cost[i][j]);
if (cost[i][j] == 0)
{
cost[i][j] = INT_MAX;
}
}
}
printf("The edges of Minimum Cost Spanning Tree are\n\n");
while(edges < n-1)
{
min = INT_MAX;
for(i = 1; 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 the edge does not form a cycle, include it in the MST
if(uni(u,v))
{
printf("Edge (%d, %d) with weight %d\n", a, b, min);
mincost += min;
edges++;
}
cost[a][b] = cost[b][a] = INT_MAX; // Mark the edge as included in
MST
}
printf("\n\tMinimum cost = %d\n", mincost);
return 0;
}
Floydd Warshall
#include<stdio.h>
#define INF 99999 // Define a large value to represent infinity
int i, j, k, n, dist[10][10];
void floydWarshell ()
{
for (k = 0; k < n; k++)
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
if (dist[i][k] + dist[k][j] < dist[i][j])
dist[i][j] = dist[i][k] + dist[k][j];
}
int main()
{
printf("Enter the number of vertices: ");
scanf("%d", &n);
printf("\nEnter the adjacency matrix (use %d for no edge):\n", INF);
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
printf("dist[%d][%d]: ", i, j);
scanf("%d", &dist[i][j]);
}
}
floydWarshell();
printf("\nShortest distances between every pair of vertices:\n");
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
if (dist[i][j] == INF)
{
printf("INF\t");
} else
{
printf("%d\t", dist[i][j]);
}
}
printf("\n");
}
return 0;
}
Enter the number of vertices: 3
Enter the adjacency matrix (use 99999 for no edge):
dist[0][0]: 0
dist[0][1]: 4
dist[0][2]: 11
dist[1][0]: 6
dist[1][1]: 0
dist[1][2]: 2
dist[2][0]: 3
dist[2][1]: 99999
dist[2][2]: 0
Shortest distances between every pair of vertices:
0 4 6
5 0 2
3 7 0
N-Queen
#include<stdio.h>
#include<math.h>
int board[20], count = 0;
//check if a queen can be placed at the given position
int place(int row, int column)
{
int i;
for(i = 1; i <= row-1; i++)
{
//checking for column and diagonal conflicts
if (board[i] == column || abs(board[i] - column) == abs(i - row))
{
return 0; // Conflict found
}
}
return 1; //no conflicts, Queen can be placed
}
//print the board configuration for a solution
void print_board(int n)
{
int i,j;
//number of solution
printf("\n\nSolution %d : \n\n", ++count);
for(i = 1; i <= n; i++)
{
printf("\t%d", i); // for column
}
for(i = 1; i <= n; i++)
{
printf("\n\n%d\t",i); // for row
for(j=1;j<=n;j++)
{
if(board[i]==j)
{
printf("Q\t"); //Queen at i,j position
}
else
{
printf("-\t"); // empty slot
}
}
}
}
//Function to solve the N-Queens problem using backtracking
void Queen(int row,int n)
{
int column;
for(column = 1; column <= n; column++)
{
// Check if the queen can be placed
if(place(row,column))
{
board[row] = column; // Place the queen
if(row==n)
{
print_board(n); //If all queens are placed, print the
solution
}
else
{
Queen(row+1,n); // Try placing the next queen
}
}
}
}
int main()
{
int n;
printf("Enter Number of Queen's: ");
scanf("%d",&n);
Queen(1,n); // Start solving from the first row
if (count == 0)
{
printf("\nNo solutions exist for %d queens.\n", n);
}
else
{
printf("\n\nTotal number of solutions: %d\n", count);
}
return 0;
}
Enter Number of Queen's: 4
Solution 1 :
1 2 3 4
1 - Q - -
2 - - - Q
3 Q - - -
4 - - Q -
Solution 2 :
1 2 3 4
1 - - Q -
2 Q - - -
3 - - - Q
4 - Q - -
Total number of solutions: 2
Naïve String
#include<stdio.h>
#include<string.h>
void naive_string_matcher(char text[],char pat[])
{
int n, m, i, j;
int count = 0;
n = strlen(text);
m = strlen(pat);
printf("Pattern found at positions: ");
int found = 0;
for (i = 0; i <= n-m; i++)
{
for (j = 0; j < m; j++)
{
if (text[i + j] != pat[j])
break;
}
if (j == m)
{
printf("%d ", i);
found = 1;
count++;
}
}
if (!found)
{
printf("No match found.");
}
else
{
printf("\nNo. of matches found: %d", count);
}
}
int main()
{
char text[100],pat[100];
printf("Enter the text : ");
fgets(text, sizeof(text), stdin);
// Remove newline character
text[strcspn(text, "\n")] = 0;
printf("Enter the pattern : ");
fgets(pat, sizeof(pat), stdin);
pat[strcspn(pat, "\n")] = 0;
naive_string_matcher(text,pat);
return 0;
}