Skip to content

Design & Analysis Of Algorithms - Lab Part A

Q1. write a program to sort a list of N element using selection Sort techique using C.

See Code
C
#include <stdio.h>

void main() {
    int arr[100], n, i, j, min, temp;
    printf("Enter number of elements: ");
    scanf("%d", &n);
    printf("Enter %d elements: ", n);
    for (i = 0; i < n; i++)
        scanf("%d", &arr[i]);
    for (i = 0; i < n - 1; i++) {
        min = i;
        for (j = i + 1; j < n; j++)
            if (arr[j] < arr[min])
                min = j;
        temp = arr[i];
        arr[i] = arr[min];
        arr[min] = temp;
    }
    printf("Sorted array: ");
    for (i = 0; i < n; i++)
    printf("%d ", arr[i]);
}
Show Output
Enter number of elements: 5
Enter 5 elements: 5 2 3 6 1
Sorted array: 1 2 3 5 6

Q2: Write a program to perform Travelling Salesman Problem.

See Code
C
#include <stdio.h>
#include <limits.h>

#define MAX 10

int tsp(int graph[MAX][MAX], int visited[MAX], int pos, int n, int count, int cost, int start, int *minCost) {
    if (count == n && graph[pos][start]) {
        int totalCost = cost + graph[pos][start];
        if (totalCost < *minCost)
            *minCost = totalCost;
        return *minCost;
    }
    for (int i = 0; i < n; i++) {
        if (!visited[i] && graph[pos][i]) {
            visited[i] = 1;
            tsp(graph, visited, i, n, count + 1, cost + graph[pos][i], start,
                minCost);
            visited[i] = 0;
        }
    }
    return *minCost;
}

void main() {
    int graph[MAX][MAX], visited[MAX] = {0};
    int n, minCost = INT_MAX;
    printf("Enter number of cities: ");
    scanf("%d", &n);
    printf("Enter cost matrix (%dx%d):\n", n, n);
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            scanf("%d", &graph[i][j]);
    visited[0] = 1;
    tsp(graph, visited, 0, n, 1, 0, 0, &minCost);
    printf("Minimum cost: %d\n", minCost);
}
Show Output
Enter number of cities: 3
Enter cost matrix (3x3):
0 10 15
10 0 35 
15 35 0 
Minimum cost: 60

Q3: Write program to implement Dynamic programming Algorithm for the 0/1 Knapsack problem.

See Code
C
#include <stdio.h>

int max(int a, int b) {
    return (a > b) ? a : b;
}

int knapsack(int W, int wt[], int val[], int n) {
    int dp[n + 1][W + 1];
    for (int i = 0; i <= n; i++) {
        for (int w = 0; w <= W; w++) {
            if (i == 0 || w == 0)
                dp[i][w] = 0;
            else if (wt[i - 1] <= w)
                dp[i][w] = max(val[i - 1] + dp[i - 1][w - wt[i - 1]], dp[i - 1][w]);
            else
                dp[i][w] = dp[i - 1][w];
        }
    }
    return dp[n][W];
}

void main()
{
    int n, W;
    int val[100], wt[100];
    printf("Enter number of items: ");
    scanf("%d", &n);
    printf("Enter weights of items: ");
    for (int i = 0; i < n; i++)
        scanf("%d", &wt[i]);
    printf("Enter values of items: ");
    for (int i = 0; i < n; i++)
        scanf("%d", &val[i]);
    printf("Enter capacity of knapsack: ");
    scanf("%d", &W);
    int result = knapsack(W, wt, val, n);
    printf("Maximum value in knapsack: %d\n", result);
}
Show Output
Enter number of items: 4
Enter weights of items: 2 3 4 5
Enter values of items: 3 4 5 6
Enter capacity of knapsack: 5
Maximum value in knapsack: 7

Q4. Write a program to perform knapsack problem using Greedy solution.

See Code
C
#include <stdio.h>

void main() {
    int n, W;
    float weight[100], value[100], ratio[100], total = 0;
    printf("Enter number of items: ");
    scanf("%d", &n);
    printf("Enter knapsack capacity: ");
    scanf("%d", &W);
    for (int i = 0; i < n; i++) {
        printf("Enter weight and value of item %d: ", i + 1);
        scanf("%f %f", &weight[i], &value[i]);
        ratio[i] = value[i] / weight[i];
    }
    for (int i = 0; i < n; i++)
        for (int j = i + 1; j < n; j++)
            if (ratio[i] < ratio[j]) {
                float tmp;
                tmp = ratio[i];
                ratio[i] = ratio[j];
                ratio[j] = tmp;
                tmp = weight[i];
                weight[i] = weight[j];
                weight[j] = tmp;
                tmp = value[i];
                value[i] = value[j];
                value[j] = tmp;
            }
    for (int i = 0; i < n && W > 0; i++) {
        if (weight[i] <= W) {
            total += value[i];
            W -= weight[i];
        }
        else {
            total += ratio[i] * W;
            break;
        }
    }
    printf("Maximum value: %.2f\n", total);
}
Show Output
Enter number of items: 3
Enter knapsack capacity: 50
Enter weight and value of item 1: 10 60
Enter weight and value of item 2: 20 120 
Enter weight and value of item 3: 30 60
Maximum value: 220.00

Q5. Write a program to implement the dfs and bfs algorithm for a graph.

See Code
C
#include <stdio.h>

#define MAX 100
int adj[MAX][MAX], visited[MAX], n;

void dfs(int v) {
    printf("%d ", v);
    visited[v] = 1;
    for (int i = 0; i < n; i++)
        if (adj[v][i] && !visited[i])
            dfs(i);
}

void bfs(int start) {
    int queue[MAX], front = 0, rear = 0;
    for (int i = 0; i < n; i++)
        visited[i] = 0;
    queue[rear++] = start;
    visited[start] = 1;
    while (front < rear) {
        int v = queue[front++];
        printf("%d ", v);
        for (int i = 0; i < n; i++) {
            if (adj[v][i] && !visited[i]) {
                queue[rear++] = i;
                visited[i] = 1;
            }
        }
    }
}

void main() {
    int edges, u, v, start;
    printf("Enter number of vertices: ");
    scanf("%d", &n);
    printf("Enter number of edges: ");
    scanf("%d", &edges);
    printf("\n");
    for (int i = 0; i < edges; i++) {
        printf("Enter edge (u v): ");
        scanf("%d %d", &u, &v);
        adj[u][v] = 1;
        adj[v][u] = 1;
    }
    printf("Enter starting vertex: ");
    scanf("%d", &start);
    printf("\nDFS traversal: ");
    for (int i = 0; i < n; i++)
        visited[i] = 0;
    dfs(start);
    printf("\nBFS traversal: ");
    bfs(start);
}
Show Output
Enter number of vertices: 4
Enter number of edges: 3

Enter edge (u v): 0 1
Enter edge (u v): 1 2
Enter edge (u v): 2 3
Enter starting vertex: 0

DFS traversal: 0 1 2 3 
BFS traversal: 0 1 2 3

Q6. Write a program to find minimum and maximum value in an array using divide and conquer.

See Code
C
#include <stdio.h>

void findMinMax(int arr[], int low, int high, int *min, int *max) {
    int mid;
    if (low == high) {
        *min = arr[low];
        *max = arr[low];
        return;
    }
    if (high == low + 1) {
        if (arr[low] < arr[high]) {
            *min = arr[low];
            *max = arr[high];
        }
        else {
            *min = arr[high];
            *max = arr[low];
        }
        return;
    }
    mid = (low + high) / 2;
    int min1, max1, min2, max2;
    findMinMax(arr, low, mid, &min1, &max1);
    findMinMax(arr, mid + 1, high, &min2, &max2);
    *min = (min1 < min2) ? min1 : min2;
    *max = (max1 > max2) ? max1 : max2;
}

void main() {
    int arr[100], n, min, max;
    printf("Enter number of elements: ");
    scanf("%d", &n);
    printf("Enter array elements: ");
    for (int i = 0; i < n; i++)
        scanf("%d", &arr[i]);
    findMinMax(arr, 0, n - 1, &min, &max);
    printf("\nMinimum element: %d\n", min);
    printf("Maximum element: %d\n", max);
}
Show Output
Enter number of elements: 4
Enter array elements: 4 10 2 5

Minimum element: 2
Maximum element: 10

Q7. Write a simple test program to implement divide and conquer strategy. E.g Quick sort algorithm for sorting list of integers in ascending order.

See Code
C
#include <stdio.h>

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int partition(int arr[], int low, int high) {
    int pivot = arr[high];
    int i = low - 1;
    for (int j = low; j < high; j++) {
        if (arr[j] < pivot) {
            i++;
            swap(&arr[i], &arr[j]);
        }
    }
    swap(&arr[i + 1], &arr[high]);
    return i + 1;
}

void quickSort(int arr[], int low, int high) {
    if (low < high) {
        int pi = partition(arr, low, high);
        quickSort(arr, low, pi - 1);
        quickSort(arr, pi + 1, high);
    }
}

void main() {
    int n;
    printf("Enter number of elements: ");
    scanf("%d", &n);
    int arr[n];
    printf("Enter %d elements: ", n);
    for (int i = 0; i < n; i++)
        scanf("%d", &arr[i]);
    quickSort(arr, 0, n - 1);
    printf("\nSorted array: ");
    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);
    printf("\n");
}
Show Output
Enter number of elements: 5
Enter 5 elements: 2 6 1 8 3

Sorted array: 1 2 3 6 8

Q8: Write a program to implement merge sort algorithm for sorting a list of integers in ascending order.

See Code
C
#include <stdio.h>

void merge(int arr[], int l, int m, int r) {
    int i = l, j = m + 1, k = 0;
    int temp[r - l + 1];
    while (i <= m && j <= r) {
        if (arr[i] <= arr[j])
            temp[k++] = arr[i++];
        else
            temp[k++] = arr[j++];
    }
    while (i <= m)
        temp[k++] = arr[i++];
    while (j <= r)
        temp[k++] = arr[j++];
    for (i = l, k = 0; i <= r; i++, k++)
        arr[i] = temp[k];
}

void mergeSort(int arr[], int l, int r) {
    if (l < r) {
        int m = (l + r) / 2;
        mergeSort(arr, l, m);
        mergeSort(arr, m + 1, r);
        merge(arr, l, m, r);
    }
}

void main() {
    int n;
    printf("Enter number of elements: ");
    scanf("%d", &n);
    int arr[n];
    printf("Enter elements: ");
    for (int i = 0; i < n; i++)
        scanf("%d", &arr[i]);
    mergeSort(arr, 0, n - 1);
    printf("\nSorted array: ");
    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);
    printf("\n");
}
Show Output
Enter number of elements: 4
Enter elements: 4 2 1 7

Sorted array: 1 2 4 7