정렬 로직에 있어, 핵심이 되는 메소드
public void mergeSort(int[] array, int left, int right) {
if(left < right) {
int mid = (left + right) / 2;
mergeSort(array, left, mid);
mergeSort(array, mid+1, right);
merge(array, left, mid, right);
}
}
퀵 정렬과의 차이점
퀵 정렬 : 피벗(pivot) 을 통해 정렬 -> 영역을 쪼갬
합병 정렬 : 영역을 조깰 수 있을 때까지 쪼갬 -> 정렬
public static void merge(int[] array, int left, int mid, int right) {
int[] L = Arrays.copyOfRange(array, left, mid + 1);
int[] R = Arrays.copyOfRange(array, mid + 1, right + 1);
int i = 0, j = 0, k = left;
int ll = L.length, rl = R.length;
while(i < ll && j < rl) {
if(L[i] <= R[j]) {
array[k] = L[i++];
}
else {
array[k] = R[j++];
}
k++;
}
// remain
while(i < ll) {
array[k++] = L[i++];
}
while(j < rl) {
array[k++] = R[j++];
}
}
이미 합병의 대상이 되는 두 영역이 각 영역에 대해서 정렬이 되어있으므로, 단순히 두 배열을 순차적으로 비교하면서 정렬할 수 있음
LinkedList
의 정렬이 필요할 때 사용하면 효율적LinkedList
를 퀵 정렬을 사용해 정렬할 경우, 퀵 정렬은 임의 접근LinkedList
는 삽입, 삭제에 유용하지만 접근 연산이 비효율적이므로, 임의로 접근하는 퀵정렬을 사용하면 비효율적임