일단 반으로 쪼개고 나중에 합치는 정렬이다.
퀵 정렬과 다른 점은 항상 반으로만 나누기에 피벗값이 따로 필요없다는 점이다.
합병 정렬은 다음 단계들로 이루어진다.
예시를 들어 살펴보겠습니다.
7 6 5 8 3 5 9 1
전체적인 실행순서는 다음과 같습니다.
7 6 5 8 -> 7 6 -> 7 -> 6 -> merge(6, 7)
-> 5 8 -> 5 -> 8 -> merge(5, 8) -> merge(5, 6, 7, 8)
3 5 9 1 -> 3 5 -> 3 -> 5 -> merge(3, 5) -> 9 1 -> 9 -> 1 -> merge(1, 9) -> merge(1, 3, 5, 9)
-> merge(1, 3, 5, 5, 6, 7, 8, 9) -> 1 3 5 5 6 7 8 9
#include<iostream>
using namespace std;
int N,arr[1000001];
int *arr2;
void merge(int left, int right)
{
int mid = (left + right) / 2;
int i = left;
int j = mid + 1;
int k = left;
while (i <= mid && j <= right)
{
if (arr[i] <= arr[j])
arr2[k++] = arr[i++];
else
arr2[k++] = arr[j++];
}
int tmp = i>mid ? j : i;
while(k<=right) arr2[k++] = arr[tmp++];
for (int i=left;i<=right;i++) arr[i] = arr2[i];
}
void partition(int left,int right)
{
int mid;
if (left < right)
{
mid = (left + right) / 2;
partition(left, mid);
partition(mid + 1, right);
merge(left, right);
}
}
int main()
{
scanf("%d",&N);
arr2 = new int[N];
for (int i=0;i<N;i++) scanf("%d",&arr[i]);
partition(0, N - 1);
for (int i=0;i<N;i++) printf("%d\n",arr[i]) ;
}

가로 배열의 개수가 n개이고, 깊이가 과 같기에 둘을 곱해주면 과 같다.