#include <iostream>
using namespace std;
void merge(int arr[], int l, int m, int r)
{
int i, j, k;
int n1 = m - l + 1;
int n2 = r - m;
int L[n1], R[n2];
for (i = 0; i < n1; i++)
L[i] = arr[l + i];
for (j = 0; j < n2; j++)
R[j] = arr[m + 1 + j];
i = 0;
j = 0;
k = l;
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
arr[k] = L[i];
i++;
}
else {
arr[k] = R[j];
j++;
}
k++;
}
while (i < n1) {
arr[k] = L[i];
i++;
k++;
}
while (j < n2) {
arr[k] = R[j];
j++;
k++;
}
}
void mergeSort(int arr[], int n){
int left_start, right_end, mid, curr_size=1;
for(curr_size=1;curr_size<=n-1; curr_size*=2){
for(left_start = 0; left_start<n-1;left_start+=curr_size){
mid = min(left_start+curr_size-1,n-1);
right_end = min(left_start+curr_size*2-1,n-1);
merge(arr,left_start, mid, right_end);
}
}
}
void printArray(int A[], int size)
{
int i;
for (i = 0; i < size; i++)
cout << A[i] << " ";
cout << endl;
}
int main()
{
int arr[] = { 12, 11, 13, 5, 6,8,9 };
int arr_size = 7;
cout << "Given array is \n";
printArray(arr, arr_size);
mergeSort(arr, arr_size);
cout << "\nSorted array is \n";
printArray(arr, arr_size);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdm9pZCBtZXJnZShpbnQgYXJyW10sIGludCBsLCBpbnQgbSwgaW50IHIpCnsKICAgIGludCBpLCBqLCBrOwogICAgaW50IG4xID0gbSAtIGwgKyAxOwogICAgaW50IG4yID0gciAtIG07CiAKICAgIGludCBMW24xXSwgUltuMl07CiAKICAgIGZvciAoaSA9IDA7IGkgPCBuMTsgaSsrKQogICAgICAgIExbaV0gPSBhcnJbbCArIGldOwogICAgZm9yIChqID0gMDsgaiA8IG4yOyBqKyspCiAgICAgICAgUltqXSA9IGFyclttICsgMSArIGpdOwogCiAgICBpID0gMDsKICAgIGogPSAwOwogICAgayA9IGw7CiAgICB3aGlsZSAoaSA8IG4xICYmIGogPCBuMikgewogICAgICAgIGlmIChMW2ldIDw9IFJbal0pIHsKICAgICAgICAgICAgYXJyW2tdID0gTFtpXTsKICAgICAgICAgICAgaSsrOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgYXJyW2tdID0gUltqXTsKICAgICAgICAgICAgaisrOwogICAgICAgIH0KICAgICAgICBrKys7CiAgICB9CiAgICB3aGlsZSAoaSA8IG4xKSB7CiAgICAgICAgYXJyW2tdID0gTFtpXTsKICAgICAgICBpKys7CiAgICAgICAgaysrOwogICAgfQogCiAgICB3aGlsZSAoaiA8IG4yKSB7CiAgICAgICAgYXJyW2tdID0gUltqXTsKICAgICAgICBqKys7CiAgICAgICAgaysrOwogICAgfQp9CiAKdm9pZCBtZXJnZVNvcnQoaW50IGFycltdLCBpbnQgbil7CglpbnQgbGVmdF9zdGFydCwgcmlnaHRfZW5kLCBtaWQsIGN1cnJfc2l6ZT0xOwoJZm9yKGN1cnJfc2l6ZT0xO2N1cnJfc2l6ZTw9bi0xOyBjdXJyX3NpemUqPTIpewoJCWZvcihsZWZ0X3N0YXJ0ID0gMDsgbGVmdF9zdGFydDxuLTE7bGVmdF9zdGFydCs9Y3Vycl9zaXplKXsKCQkJbWlkID0gbWluKGxlZnRfc3RhcnQrY3Vycl9zaXplLTEsbi0xKTsKCQkJcmlnaHRfZW5kID0gbWluKGxlZnRfc3RhcnQrY3Vycl9zaXplKjItMSxuLTEpOwoJCQltZXJnZShhcnIsbGVmdF9zdGFydCwgbWlkLCByaWdodF9lbmQpOwoJCgkJfQoJfQp9CiAKdm9pZCBwcmludEFycmF5KGludCBBW10sIGludCBzaXplKQp7CiAgICBpbnQgaTsKICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCiAgICAgICAgY291dCA8PCBBW2ldIDw8ICIgIjsKICAgIGNvdXQgPDwgZW5kbDsKfQogCmludCBtYWluKCkKewogICAgaW50IGFycltdID0geyAxMiwgMTEsIDEzLCA1LCA2LDgsOSB9OwogICAgaW50IGFycl9zaXplID0gNzsKIAogICAgY291dCA8PCAiR2l2ZW4gYXJyYXkgaXMgXG4iOwogICAgcHJpbnRBcnJheShhcnIsIGFycl9zaXplKTsKIAogICAgbWVyZ2VTb3J0KGFyciwgYXJyX3NpemUpOwogCiAgICBjb3V0IDw8ICJcblNvcnRlZCBhcnJheSBpcyBcbiI7CiAgICBwcmludEFycmF5KGFyciwgYXJyX3NpemUpOwogICAgcmV0dXJuIDA7Cn0K