티스토리 뷰

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);
 
}
}

 

'algorithm' 카테고리의 다른 글

[입출력] 10953, 11021, 11718  (0) 2020.04.07
[입출력] 1000, 2558, 10950  (0) 2020.04.06
[Algorithm] 다이나믹 프로그래밍(Dynamic programming)  (0) 2020.03.30
CountingSort with java  (0) 2020.01.24
HeapSort with java  (0) 2020.01.24
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함