반응형
이전 포스팅에서 분할 정복에는 병합 정렬과 퀵 정렬이 있다 언급했었는데요, 오늘은 병합 정렬에 대해 공부해봅니다.
https://geukggom.tistory.com/169
1. 병합 정렬이란?
: 분할 정복 방식의 알고리즘이며, 재귀용법을 이용한 정렬 알고리즘입니다.
병합정렬의 방식을 단계별로 설명하면 다음과 같습니다.
1) 배열을 반으로 쪼갭니다.
2) 1) 과정을 재귀용법을 이용해 반복합니다.
3) 쪼개진 두 배열들을 합병 정렬을 이용해 합치며 정렬합니다.
움짤로 보시면 더 이해가 쉽습니다.
2. 병합 정렬 구현
위에서 설명한 단계별로 구현해보겠습니다.
1) 배열을 반으로 쪼갭니다.
int cutNum = list.Count / 2;
List<int> leftList = list.ToList();
List<int> rightList = list.ToList();
leftList.RemoveRange(cutNum, list.Count - cutNum);
rightList.RemoveRange(0, cutNum);
2) 1) 과정을 재귀용법을 이용해 반복합니다.
public List<int> mergeSort(List<int> list)
{
if (list.Count <= 1) return list;
int cutNum = list.Count / 2;
List<int> leftList = list.ToList();
List<int> rightList = list.ToList();
leftList.RemoveRange(cutNum, list.Count - cutNum);
leftList = mergeSort(leftList);
rightList.RemoveRange(0, cutNum);
rightList = mergeSort(rightList);
return mergeList(leftList, rightList);
}
3) 쪼개진 두 배열들을 합병 정렬을 이용해 합치며 정렬합니다.
public List<int> mergeList(List<int> leftList, List<int> rightList)
{
List<int> mergedList = new List<int>();
int leftIndex = 0;
int rightIndex = 0;
while(leftList.Count > leftIndex && rightList.Count > rightIndex)
{
if(leftList[leftIndex] <= rightList[rightIndex])
{
mergedList.Add(leftList[leftIndex]);
leftIndex++;
}
else
{
mergedList.Add(rightList[rightIndex]);
rightIndex++;
}
}
if(leftList.Count > leftIndex)
{
for (int i = leftIndex; i < leftList.Count; i++)
{
mergedList.Add(leftList[i]);
}
}
else if (rightList.Count > rightIndex)
{
for (int i = rightIndex; i < rightList.Count; i++)
{
mergedList.Add(rightList[i]);
}
}
return mergedList;
}
반응형
'[Computer Science] > [알고리즘]' 카테고리의 다른 글
[알고리즘] 탐색 알고리즘(feat. 순차탐색, 이진탐색) (0) | 2022.02.08 |
---|---|
[알고리즘] 퀵정렬(Quick sort) (0) | 2022.02.07 |
[알고리즘] 동적 계획법과 분할 정복 (0) | 2022.02.05 |
[알고리즘] 삽입 정렬(Insertion sort) (0) | 2022.02.03 |
[알고리즘] 선택 정렬(Selection sort) (0) | 2022.02.02 |