본문 바로가기
C++/알고리즘

[C++] Merging Sort

by 덤더리덤떰 2023. 12. 14.

1. 병합 정렬

: Divide Conquer 기법 이용

 

1-1. 병합 정렬 알고리즘 동작 과정

  • 재귀문을 돌며 주어진 배열들을 단말노드로 될 때까지 Divide

void MergeSort(int * arr, int * tmp, int start, int end) {
	
	if (start < end) {
		int mid = (start + end) / 2;

		MergeSort(arr, tmp, start, mid);
		MergeSort(arr, tmp, mid + 1, end);
		Merge(arr, tmp, start, mid, end);
	}
}

 

  • 분리된 배열들을 정렬하며 합치는 과정
void Merge(int* arr, int* tmp, int start, int mid, int end) {

	int idx = start;
	int left = start;
	int right = mid + 1;

	for (int i = start; i <= end; i++) {
		tmp[i] = arr[i];
	}

	while (left <= mid && right <= end) {
		if (tmp[left] <= tmp[right]) {
			arr[idx++] = tmp[left++];
		}
		else {
			arr[idx++] = tmp[right++];
		}
	}

	while (left <= mid) {
		arr[idx++] = tmp[left++];
	}
	while (right <= end) {
		arr[idx++] = tmp[right++];
	}
}

1-2. 전체 소스 코드 

#include <iostream>
using namespace std;

void Merge(int* arr, int* tmp, int start, int mid, int end) {

	int idx = start;
	int left = start;
	int right = mid + 1;

	for (int i = start; i <= end; i++) {
		tmp[i] = arr[i];
	}

	while (left <= mid && right <= end) {
		if (tmp[left] <= tmp[right]) {
			arr[idx++] = tmp[left++];
		}
		else {
			arr[idx++] = tmp[right++];
		}
	}

	while (left <= mid) {
		arr[idx++] = tmp[left++];
	}
	while (right <= end) {
		arr[idx++] = tmp[right++];
	}
}

void MergeSort(int * arr, int * tmp, int start, int end) {
	
	if (start < end) {
		int mid = (start + end) / 2;

		MergeSort(arr, tmp, start, mid);
		MergeSort(arr, tmp, mid + 1, end);
		Merge(arr, tmp, start, mid, end);
	}
}



int main() {

	int arr[] = { 4,2,6,3,7,8,5,1 };
	int size = sizeof(arr) / sizeof(int);
	int* tmp = new int[size];
	
	cout << "[원본 배열 출력]\n";
	for (auto element : arr) {
		cout << element << " ";
	}

	MergeSort(arr, tmp, 0, size-1);

	cout << "\n\n[Merge Sort 결과 배열 출력]\n";
	for (int i = 0; i < size; i++) {
		cout << arr[i] << " ";
	}




	getchar();
	return 0;
}

'C++ > 알고리즘' 카테고리의 다른 글

[C++] 이분 그래프(Bigraph)  (0) 2023.12.13
[C++] BST Operations  (1) 2023.12.07
[C++] Binary Tree Operations  (1) 2023.12.05
[C++]Shuffle Doubly linked list  (0) 2023.11.30
[C++]Split Doubly Linked List  (0) 2023.11.29