Skip to content

Latest commit

 

History

History
66 lines (42 loc) · 834 Bytes

File metadata and controls

66 lines (42 loc) · 834 Bytes
#include <iostream>
#include <stack>

void Merge(int l, int m, int r);
void MergeSort(int l, int r);

int arr[] = { 9,0,4,5,6,7,1,8,2,3 };

int main() {

	int n = sizeof(arr)/sizeof(arr[0]);
	
	MergeSort(0, n - 1);

	for (auto elem : arr)
		std::cout << elem << ' ';
}


void Merge(int l, int m, int r) {

	std::stack<int> L_stk, R_stk;
	L_stk.push(INT_MAX), R_stk.push(INT_MAX);

	for (int i = r; i >= l; --i) {

		if (i <= m)
			L_stk.push(arr[i]);

		else
			R_stk.push(arr[i]);

	}

	for (int i = l; i <= r; ++i) {

		int L = L_stk.top(), R = R_stk.top();
		if (L <= R) {
			arr[i] = L;
			L_stk.pop();
		}
		else if (L > R) {
			arr[i] = R;
			R_stk.pop();
		}
	}
}

void MergeSort(int l, int r) {

	if (l >= r)
		return;

	int mid = (l + r) / 2;

	MergeSort(l, mid);

	MergeSort(mid + 1, r);

	Merge(l, mid, r);

}