Professional Documents
Culture Documents
1) Let A be a two-dimensional matrix of size nxn (n>2), Write an algorithm (Divide and
Conquer) and subsequent program code to display the maximum element of diagonal
elements of A and the minimum element of anti-diagonal elements of A.
CODE –
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
void diagonal_merge(int a[100][100], int f, int m, int l)
{
int n1 = m - f + 1; //middle - first
int n2 = l - m; // last - middle
int left[n1] , right[n2]; //left subarray //right subarray
for (int i = 0; i < n1; i++)
{
left[i] = a[f + i][f + i];
}
for (int i = 0; i < n2; i++)
{
right[i] = a[m + 1 + i][m + 1 + i];
}
int i = 0, j = 0, k = f;
while (i < n1 && j < n2)
{
if (left[i] <= right[j])
{
a[k][k] = left[i];
i++;
k++;
}
else
{
a[k][k] = right[j];
j++;
k++;
}
}
while (i < n1)
{
a[k][k] = left[i];
i++;
k++;
}
while (j < n2)
{
a[k][k] = right[j];
j++;
k++;
}
}
void mergesort_diagonal(int a[100][100], int f, int l)
{
if (f < l)
{
int m = f + (l - f) / 2;
mergesort_diagonal(a, f, m);
mergesort_diagonal(a, m + 1, l);
diagonal_merge(a, f, m, l);
}
}
void display_array(int a[100][100], int n)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cout << a[i][j] << "\t";
}
cout<<"\n";
}
}
int main()
{
int i, n;
cout<<"Enter the number of rows & columns = ";
cin >> n;
int arr[100][100];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> arr[i][j];
}
}
int len_array = n-1;
mergesort_diagonal(arr, 0, len_array);
printf("\nThe Sorted diagonal matrix is = \n");
display_array(arr, n);
return 0;
}
OUTPUT –
2) Modify the Merge-sort algorithm and implement the program such that the algorithm
functions for the string-based input-outputs. That is, your algorithm should sort the
given n words and arrange them in an increasing order. You can choose any measure for
the ordering purpose. Compute the time-complexity of your algorithm in an
experimental approach. Compare this algorithm with that of the algorithm which takes n
numbers as input and decide which works efficiently.
CODE –
#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;
void merge(string array[], int const left, int const mid, int const right)
{
auto const arr1 = mid - left + 1;
auto const arr2 = right - mid;
auto *leftArray = new
string[arr1];
auto *rightArray = new string[arr2];
for (auto i = 0; i < arr1; i++)
leftArray[i] = array[left + i];
for (auto j = 0; j < arr2; j++)
rightArray[j] = array[mid + 1 + j];
auto indexOfSubArrayOne = 0,
indexOfSubArrayTwo = 0;
int indexOfMergedArray = left;
while (indexOfSubArrayOne < arr1 && indexOfSubArrayTwo < arr2)
{
if (leftArray[indexOfSubArrayOne] <= rightArray[indexOfSubArrayTwo])
{
array[indexOfMergedArray] = leftArray[indexOfSubArrayOne];
indexOfSubArrayOne++;
}
else
{
array[indexOfMergedArray] = rightArray[indexOfSubArrayTwo];
indexOfSubArrayTwo++;
}
indexOfMergedArray++;
}
while (indexOfSubArrayOne < arr1)
{
array[indexOfMergedArray] = leftArray[indexOfSubArrayOne];
indexOfSubArrayOne++;
indexOfMergedArray++;
}
while (indexOfSubArrayTwo < arr2)
{
array[indexOfMergedArray] = rightArray[indexOfSubArrayTwo];
indexOfSubArrayTwo++;
indexOfMergedArray++;
}
}
void mergeSort(string array[], int const first, int const last)
{
if (first >=last)
return;
int main()
{
int n;
cout<<"Enter the number of strings you want = ";
cin>>n;
string arr[n];
for(int i=0;i<n;i++)
{
cin>>arr[i];
}
cout << "The current array = ";
display_Array(arr, n);
mergeSort(arr, 0, n - 1);
OUTPUT –
4) Run the merge-sort algorithm for different inputs i1, i2, ..i10, where i1 is an array of n
single digit numbers, i2 is an array of n two digit numbers, ..., i10n is an array of n 10-digit
numbers. For each of the above ten experiments, compute the t(P). Based on the
experiment, compute the time taken by your machine to compare two n − digit numbers.
CODE –
#include <iostream>
#include <algorithm>
#include <chrono>
#include <vector>
using namespace std;
using namespace std::chrono;
void merge(int array[], int const left, int const mid, int const right)
{
auto const arr1 = mid - left + 1;
auto const arr2 = right - mid;
auto *leftArray = new int[arr1];
auto *rightArray = new int[arr2];
for (auto i = 0; i < arr1; i++)
leftArray[i] = array[left + i];
for (auto j = 0; j < arr2; j++)
rightArray[j] = array[mid + 1 + j];
auto indexOfSubArrayOne = 0,
indexOfSubArrayTwo = 0;
int indexOfMergedArray = left;
while (indexOfSubArrayOne < arr1 && indexOfSubArrayTwo < arr2)
{
if (leftArray[indexOfSubArrayOne] <= rightArray[indexOfSubArrayTwo])
{
array[indexOfMergedArray] = leftArray[indexOfSubArrayOne];
indexOfSubArrayOne++;
}
else
{
array[indexOfMergedArray] = rightArray[indexOfSubArrayTwo];
indexOfSubArrayTwo++;
}
indexOfMergedArray++;
}
while (indexOfSubArrayOne < arr1)
{
array[indexOfMergedArray] = leftArray[indexOfSubArrayOne];
indexOfSubArrayOne++;
indexOfMergedArray++;
}
while (indexOfSubArrayTwo < arr2)
{
array[indexOfMergedArray] = rightArray[indexOfSubArrayTwo];
indexOfSubArrayTwo++;
indexOfMergedArray++;
}
}
void mergeSort(int array[], int const first, int const last)
{
if (first >= last)
return;
OUTPUT –
6) Read a file which is containing names of the students. Apply merge-sort technique to
sort the last character of each student’s name in reverse lexicographical ordering.
CODE –
#include <iostream>
#include <fstream>
using namespace std;
void merge(char a[], int first, int mid, int last)
{
int i, j, k;
int n1 = mid - first + 1;
int n2 = last - mid;
char arr_left[70], arr_right[70];
for (i = 0; i < n1; i++)
{
arr_left[i] = a[first + i];
}
for (j = 0; j < n2; j++)
{
arr_right[j] = a[mid + 1 + j];
}
i = 0, j = 0, k = first;
while (i < n1 && j < n2)
{
if (tolower(arr_right[j]) > tolower(arr_left[i])) //to lowercase all
characters
{
a[k] = arr_right[j];
j++;
}
else
{
a[k] = arr_left[i];
i++;
}
k++;
}
while (i < n1)
{
a[k] = arr_left[i];
i++;
k++;
}
while (j < n2)
{
a[k] = arr_right[j];
j++;
k++;
}
}
void MergeSort(char arr[], int first, int last)
{
if (first < last)
{
int mid = first + (last - first) / 2;
MergeSort(arr, first, mid);
MergeSort(arr, mid + 1, last);
merge(arr, first, mid, last);
}
}
void display(char arr[], int n)
{
for (int i = 0; i < n; i++)
{
cout<<"\n"<<arr[i];
}
}
int main()
{
int len = 0;
string file_line;
char arr_names[50];
ifstream file(R"(C:\Users\dell\Desktop\names.txt)");
while (getline(file, file_line))
{
arr_names[len] = file_line.back();
len++;
}
MergeSort(arr_names, 0, len - 1);
cout << "\n Sorted Array of Characters = ";
display(arr_names, len);
}
OUTPUT –
Names.txt file content –