새소식

💻 Programming (프로그래밍)/C++

[C++][구현] 합병 정렬 (Merge Sort)

  • -

⭐ 합병 정렬 (Merge Sort)

 

크게 나누는 Split부분

 

합치는 merge 부분이 있습니다.

 

split 부분에서는 재귀적(reculsive) 방법을 이용하여 나눠진 개수가 1개가 될 때 까지 나눠줍니다.

 

이 후, begin Index와 last Index를 이용하여, merge를 해줍니다.

 

각각 비교를 해가며, 작은 수 부터 vector에 임시 저장한 후

 

반복문이 끝난 후 그 임시저장 한 vector를 다시 배열에 재배치 시켜줍니다.

 

이를 반복하면 정렬이 완성이 됩니다.


#include <iostream>
#include <vector>
using namespace std;

void mergeSort(int nums[], int beginIdx, int lastIdx) { // O(nlgn)
	vector<int> tmp;

	if (beginIdx < lastIdx) {
		// Split
		int mid = (beginIdx + lastIdx)/2;
		mergeSort(nums, beginIdx, mid);
		mergeSort(nums, mid + 1, lastIdx);
		
		// Merge
		int left_side_size = mid - beginIdx + 1;
		int right_side_size = lastIdx - mid;

		int left_side_Idx = beginIdx;
		int right_side_Idx = beginIdx + left_side_size;

		while (left_side_Idx < beginIdx + left_side_size && right_side_Idx < lastIdx + 1) {
			if (nums[left_side_Idx] < nums[right_side_Idx]) {
				tmp.push_back(nums[left_side_Idx]);
				left_side_Idx++;
			}
			else {
				tmp.push_back(nums[right_side_Idx]);
				right_side_Idx++;
			}
		}

		while (right_side_Idx < lastIdx + 1) {
			tmp.push_back(nums[right_side_Idx++]);
		}
		while (left_side_Idx < beginIdx + left_side_size) {
			tmp.push_back(nums[left_side_Idx++]);
		}

		// 배열에 정렬된 값 넣어주기
		for (int i = 0; i < (left_side_size + right_side_size); i++) {
			nums[beginIdx + i] = tmp[i];
		}
	}
}

int main() {
	int nums[6] = { 0, 4, 2, 3, 7, 6 };
	mergeSort(nums, 0, 5);

	for (int i = 0; i < 6; i++) {
		cout << nums[i] << ' ';
	}

}

 

시간복잡도는 O(nlgn) 이고, stable한 정렬 방법입니다.

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.