Algorithms
[Sort] 병합 정렬 (Merge Sort)
kkkkkkkkkkkk
2022. 6. 26. 22:56
소개
- 많은 양의 데이터가 한 개가 될 때까지 반으로 분해하고 또 분해한다.
- 그리고 다시 그 데이터를 정렬하고 병합하는 알고리즘을 병합정렬이라 한다.
- 시간복잡도는 O(nlogn)을 가진다.
동작원리
- 배열을 반으로 계속 나눈다.
- 왼쪽배열이 오른쪽배열보다 작아질 때 병합을 시켜준다.
- 병합할 때 정렬을 하면서 병합한다.
구현 코드
public void mergeSort(int[] arr, int left, int right) {
if (left < right) {
int middle = (left + right) / 2;
mergeSort(arr, left, middle);
mergeSort(arr, middle + 1, right);
merge(arr, left, middle, right);
}
}
private void merge(int[] arr, int left, int middle, int right) {
int[] temp = new int[arr.length];
int part1 = left;
int part2 = middle + 1;
int index = left;
while (part1 <= middle && part2 <= right) {
if (arr[part1] <= arr[part2]) {
temp[index++] = arr[part1++];
} else {
temp[index++] = arr[part2++];
}
}
while (part1 <= middle) {
temp[index++] = arr[part1++];
}
while (part2 <= right) {
temp[index++] = arr[part2++];
}
for (int i = 0; i <= right - left; i++) {
arr[i + left] = temp[i + left];
}
}