[Algorithm] Merge Sort

Updated:

  • 분할 정복(divide and conquer) 방법 을 통해 주어진 배열을 정렬
  • 퀵소트와는 반대로 안정 정렬에 속함
  • 요소를 쪼갠 후, 다시 합병시키면서 정렬해나가는 방식으로, 쪼개는 방식은 퀵정렬과 유사
  • 퀵소트와의 차이점
    • 퀵정렬 : 우선 피벗을 통해 정렬(partition) → 영역을 쪼갬(quickSort)
    • 합병정렬 : 영역을 쪼갤 수 있을 만큼 쪼갬(mergeSort) → 정렬(merge)

Implementation

void merge(int* arr, int start, int mid, int end) {
	int i = start;
	int j = mid + 1;
	int k = start;

	while (i <= mid && j <= end) {
		if (arr[i] <= arr[j]) {
			sorted[k++] = arr[i++];
		}
		else {
			sorted[k++] = arr[j++];
		}
	}

	// 아직 안 넣은 값 마저 넣어주기
	if (i > mid) {
		for (int t = j; t <= end; ++t) {
			sorted[k++] = arr[t];
		}
	}
	else {
		for (int t = i; t <= mid; ++t) {
			sorted[k++] = arr[t];
		}
	}

	for (int t = start; t <= end; ++t) {
		arr[t] = sorted[t];
	}
}

void mergeSort(int* arr, int start, int end) {
	if (start >= end) return;
	int mid = (start + end) / 2;
	mergeSort(arr, start, mid);
	mergeSort(arr, mid + 1, end);
	merge(arr, start, mid, end);
}
  • Time Complexity : O(nlogn)
  • Execution Time (sec) : 0.007 (원소 30000개 기준)

C++ 코드


ref :
병합정렬

Leave a comment