사진출처: https://ko.wikipedia.org/wiki/%ED%95%A9%EB%B3%91_%EC%A0%95%EB%A0%AC
package algorithm;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class MergeSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
Integer[] arr = {3,8,43,20,9,15,61,54,13,94,2,10};
List<Integer> list = new ArrayList<>(Arrays.asList(arr));
System.out.println(split(list).toString());
}
// Recursive하게 List를 절반으로 나눠주고 다시 병합해준다.
public static List<Integer> split(List<Integer> list){
if (list.size() <= 1)
return list;
int listSize = list.size();
List<Integer> left = list.subList(0, listSize/2);
List<Integer> right = list.subList(listSize/2, listSize);
left = split(left);
right = split(right);
return merge(left, right);
}
// 2개의 list를 앞의 수를 계속 비교해가며 작은 수부터 merged list에 넣어 정렬하며 합친다.
public static List<Integer> merge(List<Integer> left, List<Integer> right){
// left, right가 둘 다 있을 때
int leftPoint = 0;
int rightPoint = 0;
List<Integer> merged = new ArrayList<>();
while(left.size() > leftPoint && right.size() > rightPoint) {
if(left.get(leftPoint) < right.get(rightPoint)) {
merged.add(left.get(leftPoint));
leftPoint++;
}
else {
merged.add(right.get(rightPoint));
rightPoint++;
}
}
// left가 없을 때
while (left.size() > leftPoint) {
merged.add(left.get(leftPoint));
leftPoint++;
}
// right가 없을 때
while (right.size() > rightPoint) {
merged.add(right.get(rightPoint));
rightPoint++;
}
return merged;
}
}