#include <iostream>
int data[10], tmp[10];
void divide(int lt, int rt){
int mid;
int p1, p2, p3;
if(lt < rt)
{
//나누기
mid = (lt+rt)/2;
divide(lt, mid);
divide(mid+1,rt);
//합치기
p1 = lt;
p2 = mid+1;
p3 = lt;
while(p1 <= mid && p2 <= rt){
if(data[p1] < data[p2]) tmp [p3++] = data[p1++];
else tmp [p3++] = data[p2++];
}
//나머지 쓸어담기
while(p1 <= mid) tmp[p3++] = data[p1++];
while(p2 <= rt) tmp[p3++] = data[p2++];
//원데이터 바꾸기
for(int i = lt; i <= rt; i++){
data[i] = tmp[i];
}
}
}
int main() {
int n, i;
scanf("%d", &n);
for(i = 1; i <= n; i++){
scanf("%d", &data[i]);
}
//lt rt넘기기 == 정렬 범위
divide(1,n);
for(i = 1; i <= n; i++){
printf("%d ", data[i]);
}
return 0;
}
- 재귀적으로 배열을 분할하고
- 투포인터 알고리즘으로 배열을 정렬 및 합친다.
- 배열을 실제로 나눈다고 생각하면 헷갈린다.
- data배열이 나뉘어지는게 아니라 DFS트리를 만들고 투포인터 알고리즘의 포인터가 해당 함수의 매개변수를 이용하여 data배열을 가리키고 있는 것이다.
https://www.inflearn.com/course/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98/dashboard