diff --git a/Solved-Problems/Merge-Sort/mergesort.cpp b/Solved-Problems/Merge-Sort/mergesort.cpp new file mode 100644 index 0000000..39e86c5 --- /dev/null +++ b/Solved-Problems/Merge-Sort/mergesort.cpp @@ -0,0 +1,91 @@ +#include +using namespace std; + +// Merges two subarrays of arr[]. +// First subarray is arr[left..mid] +// Second subarray is arr[mid+1..right] +void merge(vector& arr, int left, + int mid, int right) +{ + int n1 = mid - left + 1; + int n2 = right - mid; + + // Create temp vectors + vector L(n1), R(n2); + + // Copy data to temp vectors L[] and R[] + for (int i = 0; i < n1; i++) + L[i] = arr[left + i]; + for (int j = 0; j < n2; j++) + R[j] = arr[mid + 1 + j]; + + int i = 0, j = 0; + int k = left; + + // Merge the temp vectors back + // into arr[left..right] + while (i < n1 && j < n2) { + if (L[i] <= R[j]) { + arr[k] = L[i]; + i++; + } + else { + arr[k] = R[j]; + j++; + } + k++; + } + + // Copy the remaining elements of L[], + // if there are any + while (i < n1) { + arr[k] = L[i]; + i++; + k++; + } + + // Copy the remaining elements of R[], + // if there are any + while (j < n2) { + arr[k] = R[j]; + j++; + k++; + } +} + +// begin is for left index and end is right index +// of the sub-array of arr to be sorted +void mergeSort(vector& arr, int left, int right) +{ + if (left >= right) + return; + + int mid = left + (right - left) / 2; + mergeSort(arr, left, mid); + mergeSort(arr, mid + 1, right); + merge(arr, left, mid, right); +} + +// Function to print a vector +void printVector(vector& arr) +{ + for (int i = 0; i < arr.size(); i++) + cout << arr[i] << " "; + cout << endl; +} + +// Driver code +int main() +{ + vector arr = { 12, 11, 13, 5, 6, 7 }; + int n = arr.size(); + + cout << "Given vector is \n"; + printVector(arr); + + mergeSort(arr, 0, n - 1); + + cout << "\nSorted vector is \n"; + printVector(arr); + return 0; +}