백준에서 재귀 관련 문제를 풀다가 병합/합병 정렬[Merge sort]
을 처음 보았다.
이전에 정렬에 대해 공부했을때 여러가지를 보았지만 새로운 정렬 방법을 알게되어서 좋은 경험이였습니다!!😀
이번에 병합 정렬에 대해 공부한 내용을 정리해보려고합니다.
예시 데이터
[38, 27, 43, 3, 9, 82, 10, 45]
Step 1: 분할 (Divide)
배열을 계속 반으로 나눕니다. 먼저 배열을 반으로 나누면
//더 이상 배열을 나눌 수 없을 때까지 계속됩니다.
[38] [27] [43] [3] [9] [82] [10] [45]
Step 2: 병합 (Merge)
병합하는 단계에서는 각 배열을 정렬하며 결합합니다.
// 1.먼저 [38]과 [27]을 비교하고, 작은 값을 먼저 넣어줍니다.
[38], [27] -> [27, 38]
// 2.다음으로 [43]과 [3]도 병합합니다.
[43], [3] -> [3, 43]
// 3.다른 그룹들도 병합합니다.
[9], [82] -> [9, 82]
[10], [45] -> [10, 45]
// 4.이제 병합된 배열을 다시 결합합니다.
[27, 38], [3, 43] -> [3, 27, 38, 43]
[9, 82], [10, 45] -> [9, 10, 45, 82]
// 5.마지막으로 두 배열을 병합하면 최종 정렬된 배열이 됩니다.
[3, 27, 38, 43], [9, 10, 45, 82] -> [3, 9, 10, 27, 38, 43, 45, 82]
<Java로 구현한 Merge sort>
public class Merge_sort {
static int[] temp, arr;
// Merge Sort 메소드
private static void merge_sort(int[] arr, int left, int right) {
if (left < right) {
int mid = (left + right) / 2; // 배열의 중앙 구하기
merge_sort(arr, left, mid); // 전반부 정렬
merge_sort(arr, mid + 1, right); // 후반부 정렬
merge(arr, left, mid, right); // 병합 작업
}
}
// 병합 메소드
private static void merge(int[] arr, int left, int mid, int right) {
int i = left;
int j = mid + 1;
int k = left;
// 병합 과정
while (i <= mid && j <= right) {
if (arr[i] <= arr[j]) {
temp[k++] = arr[i++];
} else {
temp[k++] = arr[j++];
}
}
// 왼쪽 배열에 남은 요소 처리
while (i <= mid) {
temp[k++] = arr[i++];
}
// 오른쪽 배열에 남은 요소 처리
while (j <= right) {
temp[k++] = arr[j++];
}
// 병합된 결과를 원본 배열에 복사
for (int index = left; index < k; index++) {
arr[index] = temp[index];
}
}
// 메인 메소드
public static void main(String[] args) {
// 정렬할 배열 초기화
arr = new int[]{38, 27, 43, 3, 9, 82, 10, 45};
temp = new int[arr.length]; // 임시 배열 초기화
System.out.println("정렬 전 배열:");
for (int num : arr) {
System.out.print(num + " ");
}
System.out.println();
// Merge Sort 호출
merge_sort(arr, 0, arr.length - 1);
System.out.println("정렬 후 배열:");
for (int num : arr) {
System.out.print(num + " ");
}
}
}
예시 실행 결과
정렬 전 배열:
38 27 43 3 9 82 10 45
정렬 후 배열:
3 9 10 27 38 43 45 82