#include <iostream>
using namespace std;
void Sort_Ascending(int arr[],int l,int r,int mid) {
int i=l,j=mid+1,k=l,temp[r+1];
while (i<=mid and j<=r) {
if (arr[i]<arr[j]) {
temp[k++]=arr[i++];
}
else temp[k++]=arr[j++];
}
while (i<=mid)temp[k++]=arr[i++];
while (j<=r) temp[k++]=arr[j++];
for (int i=l;i<=r;i++)arr[i]=temp[i];
}
void Sort_Descending(int arr[],int l,int r,int mid) {
int i=l,j=mid+1,k=l,temp[r+1];
while (i<=mid and j<=r) {
if (arr[i]>arr[j]) {
temp[k++]=arr[i++];
}
else temp[k++]=arr[j++];
}
while (i<=mid)temp[k++]=arr[i++];
while (j<=r) temp[k++]=arr[j++];
for (int i=l;i<=r;i++)arr[i]=temp[i];
}
void merge(int arr[],int l, int r, bool ascending) {
if (r>l) {
int mid=(l+r)/2;
merge(arr,l,mid,ascending);
merge(arr,mid+1,r,ascending);
if (ascending)Sort_Ascending(arr,l,r,mid);
else Sort_Descending(arr,l,r,mid);
}
}
int main() {
// Time Complexity = nlog(n)
int a1[]={4,1,6,2,7,3};
int n1=sizeof(a1) / sizeof(a1[0]);
cout<<"Before Ascending Sort: ";
for (int i=0;i<n1;i++)cout<<a1[i]<<" ";
cout<<"\n";
merge(a1, 0, n1 - 1, true);
cout << "After Ascending Sort: ";
for (int i=0;i<n1;i++)cout<<a1[i]<<" ";
cout<<"\n";
int a2[]={10,2,8,5, 3, 9};
int n2=sizeof(a2)/ sizeof(a2[0]);
cout<<"\nBefore Descending Sort: ";
for (int i=0;i<n2;i++)cout<<a2[i]<<" ";
cout<<"\n";
merge(a2,0,n2-1,false);
cout << "After Descending Sort: ";
for (int i=0;i<n2;i++)cout<<a2[i]<<" ";
cout<<"\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp2b2lkIFNvcnRfQXNjZW5kaW5nKGludCBhcnJbXSxpbnQgbCxpbnQgcixpbnQgbWlkKSB7CiAgICBpbnQgaT1sLGo9bWlkKzEsaz1sLHRlbXBbcisxXTsKICAgIHdoaWxlIChpPD1taWQgYW5kIGo8PXIpIHsKICAgICAgICBpZiAoYXJyW2ldPGFycltqXSkgewogICAgICAgICAgICB0ZW1wW2srK109YXJyW2krK107CiAgICAgICAgfQogICAgICAgIGVsc2UgdGVtcFtrKytdPWFycltqKytdOwogICAgfQogICAgd2hpbGUgKGk8PW1pZCl0ZW1wW2srK109YXJyW2krK107CiAgICB3aGlsZSAoajw9cikgdGVtcFtrKytdPWFycltqKytdOwogICAgZm9yIChpbnQgaT1sO2k8PXI7aSsrKWFycltpXT10ZW1wW2ldOwp9CnZvaWQgU29ydF9EZXNjZW5kaW5nKGludCBhcnJbXSxpbnQgbCxpbnQgcixpbnQgbWlkKSB7CiAgICBpbnQgaT1sLGo9bWlkKzEsaz1sLHRlbXBbcisxXTsKICAgIHdoaWxlIChpPD1taWQgYW5kIGo8PXIpIHsKICAgICAgICBpZiAoYXJyW2ldPmFycltqXSkgewogICAgICAgICAgICB0ZW1wW2srK109YXJyW2krK107CiAgICAgICAgfQogICAgICAgIGVsc2UgdGVtcFtrKytdPWFycltqKytdOwogICAgfQogICAgd2hpbGUgKGk8PW1pZCl0ZW1wW2srK109YXJyW2krK107CiAgICB3aGlsZSAoajw9cikgdGVtcFtrKytdPWFycltqKytdOwogICAgZm9yIChpbnQgaT1sO2k8PXI7aSsrKWFycltpXT10ZW1wW2ldOwp9CnZvaWQgbWVyZ2UoaW50IGFycltdLGludCBsLCBpbnQgciwgYm9vbCBhc2NlbmRpbmcpIHsKICAgIGlmIChyPmwpIHsKICAgICAgICBpbnQgbWlkPShsK3IpLzI7CiAgICAgICAgbWVyZ2UoYXJyLGwsbWlkLGFzY2VuZGluZyk7CiAgICAgICAgbWVyZ2UoYXJyLG1pZCsxLHIsYXNjZW5kaW5nKTsKICAgICAgICBpZiAoYXNjZW5kaW5nKVNvcnRfQXNjZW5kaW5nKGFycixsLHIsbWlkKTsKICAgICAgICBlbHNlIFNvcnRfRGVzY2VuZGluZyhhcnIsbCxyLG1pZCk7CiAgICB9Cn0KaW50IG1haW4oKSB7CiAgICAvLyBUaW1lIENvbXBsZXhpdHkgPSBubG9nKG4pCgogICAgaW50IGExW109ezQsMSw2LDIsNywzfTsKICAgIGludCBuMT1zaXplb2YoYTEpIC8gc2l6ZW9mKGExWzBdKTsKICAgIGNvdXQ8PCJCZWZvcmUgQXNjZW5kaW5nIFNvcnQ6ICI7CiAgICBmb3IgKGludCBpPTA7aTxuMTtpKyspY291dDw8YTFbaV08PCIgIjsKICAgIGNvdXQ8PCJcbiI7CiAgICBtZXJnZShhMSwgMCwgbjEgLSAxLCB0cnVlKTsKICAgIGNvdXQgPDwgIkFmdGVyIEFzY2VuZGluZyBTb3J0OiAgIjsKICAgIGZvciAoaW50IGk9MDtpPG4xO2krKyljb3V0PDxhMVtpXTw8IiAiOwogICAgY291dDw8IlxuIjsKCiAgICBpbnQgYTJbXT17MTAsMiw4LDUsIDMsIDl9OwogICAgaW50IG4yPXNpemVvZihhMikvIHNpemVvZihhMlswXSk7CiAgICBjb3V0PDwiXG5CZWZvcmUgRGVzY2VuZGluZyBTb3J0OiAiOwogICAgZm9yIChpbnQgaT0wO2k8bjI7aSsrKWNvdXQ8PGEyW2ldPDwiICI7CiAgICBjb3V0PDwiXG4iOwogICAgbWVyZ2UoYTIsMCxuMi0xLGZhbHNlKTsKICAgIGNvdXQgPDwgIkFmdGVyIERlc2NlbmRpbmcgU29ydDogICI7CiAgICBmb3IgKGludCBpPTA7aTxuMjtpKyspY291dDw8YTJbaV08PCIgIjsKICAgIGNvdXQ8PCJcbiI7CiAgICByZXR1cm4gMDsKfQ==