개념

합병 정렬

개발참치 2021. 7. 7.

시간 계산이 빠른 정렬 중에 하나입니다.

분할 정복 (큰 문제를 작은 문제로 쪼개 해결해 나가는 방법)을 통해 구현한 정렬입니다.

 

합병 정렬은 3가지 과정을 거쳐 정렬을 완료합니다.

과정

  • 분할 (Divide) - 입력 배열을 비슷한 크기의 2개의 부분 배열로 분할합니다.
  • 정복 (Conquer) - 크기가 충분히 작아질 때 까지 분할된 부분 배열을 정렬합니다. 
  • 결합 (Combine) - 정렬된 부분 배열들을 하나의 배열에 다시 결합합니다.

특징

  • 분할 정복 알고리즘
  • 안정 정렬
  • 배열로 구성할 시에, 임시 배열이 필요할 수 있다
  • 연결 리스트로 구성하면, 데이터에 이동은 무시할 수 있다. - 제자리 정렬이라고도 할 수 있음
  • 연결 리스트 시에 최고의 정렬 방법

복잡도

  • 최악: O (nlogn)
  • 최선: O (nlogn)
  • 평균: O (nlogn)
굉장히 효율적인 편입니다.

예시 그림

구현 코드 ( java )

void mergeSort(int[] arr) {
	sort(arr, 0, arr.length);
}

void sort(int[] arr, int low, int high) {
  if (high - low < 2) {
  	return;
  }

  int mid = (low + high) / 2;
  sort(arr, 0, mid);
  sort(arr, mid, high);
  merge(arr, low, mid, high);
}

private static void merge(int[] arr, int low, int mid, int high) {
  int[] temp = new int[high - low];
  int t = 0, l = low, h = mid;

  while (l < mid && h < high) {
      if (arr[l] < arr[h]) {
        temp[t++] = arr[l++];
      } else {
        temp[t++] = arr[h++];
      }
    }

  while (l < mid) {
  	temp[t++] = arr[l++];
  }

  while (h < high) {
  	temp[t++] = arr[h++];
  }

  for (int i = low; i < high; i++) {
  	arr[i] = temp[i - low];
  }
}

'개념' 카테고리의 다른 글

BFS (너비 우선 탐색)  (0) 2021.07.29
DFS (깊이 우선 탐색)  (0) 2021.07.29
삽입 정렬  (0) 2021.07.07
선택 정렬  (0) 2021.07.07
버블 정렬  (0) 2021.07.07

댓글