algorithm
MergeSort with java
tonirr
2020. 1. 24. 15:10
package Sort;
import java.util.Arrays;
public class MergeSort {
// 계속 바뀌는 배열을 바로바로 적용해야 하므로 전역변수로 넣어줌.
static int[] sorted = new int[8];
public static void merge(int a[], int m, int middle, int n) {
int i = m; // 첫 번째 부분집합의 시작 위치 설정
int j = middle+1; // 두 번째 부분집합의 시작 위치 설정
// middle 다음원소부터 j가 설정됨
// 배열은 이렇게 생김 i ~ middle j ~ n
int k = m; // sorted 배열에 정렬된 원소를 저장할 위치 설정
while(i<=middle && j<=n) {
// middle 을 기준으로 양옆의 배열에서 가장작은 값부터
// sorted 배열에 우선적으로 배치할 것이므로
// i~ middle 까지의 배열, j ~ n 까지의 배열을 서로 비교하여 작은 값을 가져옴
// 이미 정렬된 두가지 배열 {8, 58} {3, 28} 로 sorted에 배치
if(a[i]<=a[j]) { // 8보다 3이 작으므로 sorted[0]에는 3이 들어감
sorted[k] = a[i];
i++;
}else {
sorted[k] = a[j]; // j ~ n 배열에서 하나가 선택되었으므로 j 에 +1
j++;
}
k++; // sorted배열 다음 자리에 그 다음 작은 숫자의 원소 채워넣을 수 있도록 k에 +1
}
// while문에서 i가 먼저 채워졌거나 j가 먼저 채워진 경우 나머지를 채우기 위해
if(i>middle) { // j 가 먼저 채워진 경우 남은 원소를 sorted에 넣어줌
for(int t=j;t<=n;t++,k++) {
sorted[k] = a[t];
}
}else { // i 가 먼저 채워진 경우
for(int t=i;t<=middle;t++,k++) {
sorted[k] = a[t];
}
}
for(int t=m;t<=n;t++) { // sorted에 배치된 원소를 a배열에 넣어줌
a[t] = sorted[t];
}
System.out.println("병합 정렬 후: "+Arrays.toString(a));
}
public static void mergeSort(int a[], int m, int n) {
int middle;
if(m<n) {
middle = (m+n)/2;
mergeSort(a, m, middle); // 앞 부분에 대한 분할 작업 수행
mergeSort(a, middle+1, n); // 뒷 부분에 대한 분할 작업 수행
merge(a, m, middle, n); // 부분집합에 대하여 정렬과 병합 작업 수행
}
}
public static void main(String[] args) {
int[] list = {58,8,28,3,18,6,33,20};
int size = list.length;
System.out.println("정렬 수행 전: "+Arrays.toString(list));
System.out.println("-----------------병합 정렬 수행 시작------------------");
mergeSort(list, 0, size-1);
}
}