Initial commit
This commit is contained in:
92
cpp/programs/sort_merge.cpp
Normal file
92
cpp/programs/sort_merge.cpp
Normal file
@@ -0,0 +1,92 @@
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
|
||||
void merge(int array[], int left, int mid, int right) {
|
||||
int leftArrLen = mid - left + 1;
|
||||
int rightArrLen = right - mid;
|
||||
|
||||
// Create temp arrays
|
||||
int leftArray[leftArrLen];
|
||||
int rightArray[rightArrLen];
|
||||
|
||||
// Copy data to temp arrays leftArray[] and rightArray[]
|
||||
for (int i = 0; i < leftArrLen; i++) {
|
||||
leftArray[i] = array[left + i];
|
||||
}
|
||||
|
||||
for (auto i = 0; i < rightArrLen; i++) {
|
||||
rightArray[i] = array[mid + 1 + i];
|
||||
}
|
||||
|
||||
int leftArrIndex = 0; // Initial index of first sub-array
|
||||
int rightArrIndex = 0; // Initial index of second sub-array
|
||||
int mergedArrIndex = left; // Initial index of merged array
|
||||
|
||||
// Merge the temp arrays back into array[left..right]
|
||||
while (leftArrIndex < leftArrLen && rightArrIndex < rightArrLen) {
|
||||
// Choose one of the two elements at current positions of left and right arrays
|
||||
if (leftArray[leftArrIndex] <= rightArray[rightArrIndex]) {
|
||||
array[mergedArrIndex] = leftArray[leftArrIndex];
|
||||
leftArrIndex++;
|
||||
} else {
|
||||
array[mergedArrIndex] = rightArray[rightArrIndex];
|
||||
rightArrIndex++;
|
||||
}
|
||||
mergedArrIndex++;
|
||||
}
|
||||
|
||||
// Copy the remaining elements of
|
||||
// left[], if there are any
|
||||
while (leftArrIndex < leftArrLen) {
|
||||
array[mergedArrIndex] = leftArray[leftArrIndex];
|
||||
leftArrIndex++;
|
||||
mergedArrIndex++;
|
||||
}
|
||||
|
||||
// Copy the remaining elements of
|
||||
// right[], if there are any
|
||||
while (rightArrIndex < rightArrLen) {
|
||||
array[mergedArrIndex] = rightArray[rightArrIndex];
|
||||
rightArrIndex++;
|
||||
mergedArrIndex++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void mergeSort(int arr[], int left, int right) {
|
||||
if (left >= right) {
|
||||
return;
|
||||
}
|
||||
|
||||
int middle = (left + right) / 2;
|
||||
mergeSort(arr, left, middle);
|
||||
mergeSort(arr, middle + 1, right);
|
||||
merge(arr, left, middle, right);
|
||||
}
|
||||
|
||||
// 4 1 3 5 2
|
||||
// 4 1 3 5 2 [4, 1] [3]
|
||||
// 4 1 3 5 2 [^1, 4] [^3]
|
||||
// 1 1 3 5 2 [1, ^4] [^3]
|
||||
// 1 3 3 5 2 [1, ^4] [3]^
|
||||
// 1 3 4 5 2 [^5] [^2]
|
||||
// 1 3 4 2 2 [^5] [2]^
|
||||
// 1 3 4 2 5
|
||||
|
||||
|
||||
|
||||
int main() {
|
||||
int N = 50;
|
||||
int arr[N];
|
||||
for (int i = 0; i < N; i++) {
|
||||
arr[i] = N - i;
|
||||
}
|
||||
|
||||
mergeSort(arr, 0, N - 1);
|
||||
|
||||
for (int i = 0; i < N; i++) {
|
||||
cout << arr[i] << " ";
|
||||
}
|
||||
cout << endl;
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user