머지소트는 합병정렬이라고도 부르며 분할 정복 방법을 통해 구현한 정렬 알고리즘입니다.
빠른 정렬 알고리즘 중 하나로 분류되며, Quick Sort와 함께 가장 많이 언급되는 정렬방식 입니다.
퀵소트와는 반대로 안정정렬이라는 특성을 갖고있죠.
시간복잡도는 평균, 최선, 최악 모두 O(nlogn)입니다.
public static void callMergeSort(int[] arr){
int [] tmp = new int[arr.length]; // 임시 저장소
mergeSort(arr,tmp,0,arr.length-1);
}
public static void mergeSort(int[] arr, int[] tmp, int start, int end){
if(start<end){
int mid = (start+end)/2;
mergeSort(arr, tmp, start, mid);
mergeSort(arr, tmp, mid+1, end);
merge(arr,tmp,start,mid,end);
}
}
public static void merge(int[] arr, int[] tmp, int start, int mid, int end){
for(int i = start; i<=end; i++){
tmp[i]=arr[i];
}
int part1 = start; // 앞쪽 배열의 시작점
int part2 = mid+1; // 뒤쪽 배열의 시작점
int index = start; // 비교한 값을 할당할 인덱스
while(part1<=mid && part2<=end){
if(tmp[part1]<=tmp[part2]){
arr[index]=tmp[part1];
part1++;
}else{
arr[index]=tmp[part2];
part2++;
}
index++;
}
//앞쪽에 남아있는 데이터를 추가해주자.
for(int i = 0; i<=mid-part1; i++){
arr[index+i]=tmp[part1+i];
}
}