철학과 학생의 개발자 도전기

병합 정렬 (Merge Sort) 본문

알고리즘

병합 정렬 (Merge Sort)

Younghun 2024. 3. 5. 10:39

1. 개요

  • 분할 정복 전략을 사용한다.
  • 배열을 절반씩 분할하고 정렬한다.
  • 정렬된 부분 배열을 하나로 병합한다.
  • 부분 배열에 추가적인 메모리를 할당한다.

2. 특징

  • 속도가 빠르다.
  • 안정 정렬이다.
  • 시간복잡도: O(NLogN)
  • 순차적인 비교를 하기 때문에 연결 리스트에서 사용하기 좋다.
  • 용량이 큰 데이터를 정렬할 때, 메모리 문제가 발생할 수 있다.

3. 코드

import java.util.Arrays;

public class MergeSortTest {

	public static void main(String[] args) {
		int[] nums = { 3, 2, 7, 5, 11, 12, 1 };

		mergeSort(nums, 0, nums.length - 1);

		System.out.println(Arrays.toString(nums));
	}

	private static void mergeSort(int[] arr, int left, int right) {
		if (left >= right) {
			return;
		}

		int mid = (left + right) / 2;

		mergeSort(arr, left, mid);
		mergeSort(arr, mid + 1, right);
		merge(arr, left, mid, right);
	}

	private static void merge(int[] arr, int left, int mid, int right) {
		int[] L = Arrays.copyOfRange(arr, left, mid + 1);
		int[] R = Arrays.copyOfRange(arr, mid + 1, right + 1);

		int i = 0;
		int j = 0;
		int k = left;

		while (i < L.length && j < R.length) {
			if (L[i] <= R[j]) {
				arr[k++] = L[i++];
			} else {
				arr[k++] = R[j++];
			}
		}

		while (i < L.length) {
			arr[k++] = L[i++];
		}

		while (j < R.length) {
			arr[k++] = R[j++];
		}
	}

}

'알고리즘' 카테고리의 다른 글

기수 정렬 (Radix Sort)  (0) 2024.03.19
힙 정렬 (Heap Sort)  (0) 2024.03.12
퀵 정렬 (Quick Sort)  (0) 2024.03.05
삽입 정렬 (Insertion Sort)  (0) 2024.03.05
선택 정렬 (Selection Sort)  (0) 2024.02.26