알고리즘
java_정렬(병합정렬)_22.06.15(day17)
양빵빵
2022. 6. 15. 16:44
코드를 돌려보니 잘 못된 부분이 있었다.
package datastructure.chap07.merge;
import java.util.Arrays;
public class MergeSort {
// 병합 소트를 하려면 임시 배열이 필요하다.
private static int[] temp;
// 병합 정렬 알고리즘
/**
* @param arr - 분할할 배열
* @param s - 분할 시작 위치
* @param e - 분할 끝 위치
*/
private static void mergeSort(int[] arr, int s, int e) {
// 분할한 배열의 원소가 1개 이하면 return
if (e - s < 1) return; // 재귀 함수 종료 조건
// 분할의 중앙점을 찾아야 함
int m = (s + e) / 2;
// 분할 작업
mergeSort(arr, s, m); // 재귀 함수
mergeSort(arr, m + 1, e);
// 병합 작업
// 부분 배열
for (int i = s; i <= e; i++) {
temp[i] = arr[i];
}
// 포인터 2개 선언
int p1 = s;
int p2 = m + 1;
// 포인터끼리 비교한 후 원본배열에 넣어야 할 위치를 지정
int insertSpot = s;
// 병합 루프
while (p1 <= m && p2 <= e) {
if (temp[p1] < temp[p2]) {
arr[insertSpot++] = temp[p1++];
} else {
arr[insertSpot++] = temp[p2++];
}
}
/*
오른쪽 부분배열이 먼저 소모된 경우에는,
왼쪽 부분배열은 아직 데이터가 남아있기 때문에
마저 뽑아서 원본배열에 순서대로 채워야 한다. (반대의 경우도 마찬가지 이다.)
*/
while (p1 <= m) {
arr[insertSpot++] = temp[p1++];
}
while (p2 <= e) {
arr[insertSpot++] = temp[p2++];
}
}
public static void sort(int[] arr) {
temp = new int[arr.length];
mergeSort(arr,0,arr.length-1);
}
public static void main(String[] args) {
int arr[] = {33, 11, 99, 1, 22, 88, 55, 44, 66, 77};
sort(arr); // 병합 정렬
System.out.println("정렬 후 : " + Arrays.toString(arr));
}
}