The code .cpp is available bellow
#include<iostream>
using namespace std;
//declaring variables
void merge(int* ip, int sz, int* opt, bool opt_asc); //merging
int* mergesort(int* ip, int sz);
void mergesort(int *ip, int sz, int* opt, bool opt_asc);
void merge(int* ip, int sz, int* opt, bool opt_asc)
{
int s1 = 0;
int mid_sz = sz / 2;
int s2 = mid_sz;
int e2 = sz;
int s3 = 0;
int end3 = sz;
int i, j;
if (opt_asc==true)
{
i = s1;
j = e2 - 1;
while (i < mid_sz && j >= s2)
{
if (*(ip + i) > *(ip + j))
{
*(opt + s3) = *(ip + j);
s3++;
j--;
}
else if (*(ip + i) <= *(ip + j))
{
*(opt + s3) = *(ip + i);
s3++;
i++;
}
}
if (i != mid_sz)
{
while (i < mid_sz)
{
*(opt + s3) = *(ip + i);
s3++;
i++;
}
}
if (j >= s2)
{
while (j >= s2)
{
*(opt + s3) = *(ip + j);
s3++;
j--;
}
}
}
else
{
i = mid_sz - 1;
j = s2;
while (i >= s1 && j <e2)
{
if (*(ip + i) > *(ip + j))
{
*(opt + s3) = *(ip + i);
s3++;
i--;
}
else if (*(ip + i) <= *(ip + j))
{
*(opt + s3) = *(ip + j);
s3++;
j++;
}
}
if (i >= s1)
{
while (i >= s1)
{
*(opt + s3) = *(ip + i);
s3++;
i--;
}
}
if (j != e2)
{
while (j < e2)
{
*(opt + s3) = *(ip + j);
s3++;
j++;
}
}
}
for (i = 0; i < sz; i++)
*(ip + i) = *(opt + i);
}
int* mergesort(int* ip, int sz)
{
int* opt = new int[sz];
mergesort(ip, sz, opt, true);
return opt;
}
void mergesort(int *ip, int sz, int* opt, bool opt_asc)
{
if (sz > 1)
{
int q = sz / 2;
mergesort(ip, sz / 2, opt, true);
mergesort(ip + sz / 2, sz - sz / 2, opt + sz / 2, false);
merge(ip, sz, opt, opt_asc);
}
}
int main()
{
int arr1[12] = { 5, 6, 9, 8,25,36, 3, 2, 5, 16, 87, 12 };
int arr2[14] = { 2, 3, 4, 5, 1, 20,15,30, 2, 3, 4, 6, 9,12 };
int arr3[10] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
int *opt;
cout << "Arays after sorting:\\";
cout << "Array 1 : ";
opt = mergesort(arr1, 12);
for (int i = 0; i < 12; i++)
cout << opt[i] << " ";
cout << endl;
cout << "Array 2 : ";
opt = mergesort(arr2, 14);
for (int i = 0; i < 14; i++)
cout << opt[i] << " ";
cout << endl;
cout << "Array 3 : ";
opt = mergesort(arr3, 10);
for (int i = 0; i < 10; i++)
cout << opt[i] << " ";
cout << endl;
return 0;
}