카테고리 없음

합병 정렬 / 병합 정렬(Merge Sort)

서원근양학계정 2023. 4. 24. 02:48

합병 정렬 / 병합 정렬

합병 정렬 / 병합 정렬(Merge Sort)은 정렬되지 않은 원소들을 하나의 원소로 분할한 다음 원소들을 정렬하면서 합병하는 알고리즘입니다.

먼저 원소들을 반복해서 분할해주면서 하나의 원소만 남을 때 까지 분할합니다.

그 다음에는 분할했던 두 원소들을 서로 합쳐주면서 정렬해줍니다.

이 과정을 반복해주면 정렬이 완료됩니다.

 

합병 정렬 / 병합 정렬 예시

 

 

합병 정렬 / 병합 정렬 C++ 코드

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>

void Partition(int left, int right, int numbers[]);
void Merge(int left, int mid, int right, int numbers[]);
void MergeSort(int number, int numbers[]);
void Swap(int* a, int* b);

int main()
{
	int number;
	int numbers[1000];

	memset(numbers, 0, sizeof(numbers));

	scanf("%d", &number);

	for (int i = 0; i < number; i++)
	{
		scanf("%d", &numbers[i]);
	}

	MergeSort(number, numbers);

	for (int i = 0; i < number; i++)
	{
		printf("%d\n", numbers[i]);
	}
}

void MergeSort(int number, int numbers[])
{
	Partition(0, number - 1, numbers);
}

void Partition(int left, int right, int numbers[])
{
	int mid;

	if (left < right)
	{
		mid = (left + right) / 2;
		Partition(left, mid, numbers);
		Partition(mid + 1, right, numbers);
		Merge(left, mid, right, numbers);
	}
}

void Merge(int left, int mid, int right, int numbers[])
{
	int left_index = left;
	int right_index = mid + 1;
	int temp_index = 0;
	int temp[1000];

	memset(temp, 0, sizeof(temp));

	while (left_index <= mid && right_index <= right)
	{
		if (numbers[left_index] < numbers[right_index])
		{
			temp[temp_index] = numbers[left_index];
			left_index++;
		}
		else
		{
			temp[temp_index] = numbers[right_index];
			right_index++;
		}

		temp_index++;
	}

	if (left_index <= mid)
	{
		for (int i = left_index; i <= mid; i++)
		{
			temp[temp_index] = numbers[i];
			temp_index++;
		}
	}
	else
	{
		for (int i = right_index; i <= right; i++)
		{
			temp[temp_index] = numbers[i];
			temp_index++;
		}
	}

	temp_index = 0;

	for (int i = left; i <= right; i++)
	{
		numbers[i] = temp[temp_index];
		temp_index++;
	}
}

void Swap(int* a, int* b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

 

합병 정렬 / 병합 정렬 시간복잡도

최선 평균 최악
nlog2n nlog2n nlog2n