HYOJIN LIM
by HYOJIN LIM
1 min read

Categories

[알고리즘] Merge Sort (병합정렬) 구현

여러 개의 정렬된 자료의 집합을 병합하여 한 개의 정렬된 집합으로 만드는 방식

  • 분할 정복 알고리즘 활용

    • 자료를 최소 단위의 문제까지 나눈 후에 차례대로 정렬하여 최종 결과를 얻음
    • top - down 방식
  • 시간 복잡도

    O[NlogN]

  • 구현

    import java.util.ArrayList;
      
    public class MergeSort {
      
    	public static void main(String[] args) {
    		int[] num = { 69, 10, 30, 2, 16, 8, 31, 22 };
    		ArrayList<Integer> list = new ArrayList<>();
    		for (int i = 0; i < num.length; i++) {
    			list.add(num[i]);
    		}
      
    		System.out.println(mergeSort(list));
    	}
      
    	public static ArrayList<Integer> mergeSort(ArrayList<Integer> arr) {
    		if (arr.size() == 1) {
    			return arr; // 개수가 하나 남았을 때 리턴
    		}
    		ArrayList<Integer> left = new ArrayList<>();
    		ArrayList<Integer> right = new ArrayList<>();
      
    		int mid = arr.size() / 2;
      
    		for (int i = 0; i < mid; i++) {
    			left.add(arr.get(i));
    		}
    		for (int i = mid; i < arr.size(); i++) {
    			right.add(arr.get(i));
    		}
    		left = mergeSort(left);
    		right = mergeSort(right);
      
    		return merge(left, right);
    	}
      
    	private static ArrayList<Integer> merge(ArrayList<Integer> left, ArrayList<Integer> right) {
    		ArrayList<Integer> result = new ArrayList<>();
      
    		while (left.size() > 0 || right.size() > 0) {
    			if (left.size() > 0 && right.size() > 0) {
    				if (left.get(0) <= right.get(0)) {
    					result.add(left.get(0));
    					left.remove(0);
    				} else {
    					result.add(right.get(0));
    					right.remove(0);
    				}
    			} else if (left.size() > 0) {
    				result.add(left.get(0));
    				left.remove(0);
    			} else if (right.size() > 0) {
    				result.add(right.get(0));
    				right.remove(0);
    			}
    		}
    		return result;
    	}
    }