Created
January 24, 2018 12:04
-
-
Save keehyun2/931ea8a1ffb5b50378dab2672d6f58f4 to your computer and use it in GitHub Desktop.
mergeSort
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 비순환 드라이버 method | |
* @param arr | |
*/ | |
void mergeSort(int[] arr) { | |
mergeSort(arr,0,arr.length); | |
} | |
/** | |
* 합병 정렬 - 분할하는 로직이 들어있고, 다른 합병정렬 알고리즘을 가지고 있는 함수를 실행합니다. | |
* @param arr 배열 | |
* @param startIndex 시작 index | |
* @param last 처음에 배열의 길이를 입력 받고, -1 해서 마지막 인덱스로 사용됩니다. | |
*/ | |
void mergeSort(int[] arr, int startIndex, int last) { // 오버로드로 선언 매개변수 개수만 다릅니다. | |
// 선조건 : 0 < startIndex < last <= arr.length | |
// 후조건 : arr[startIndex...last-1]은 오름차순이다. | |
if(last - startIndex < 2) return; | |
int middleIdex = (last + startIndex) / 2; // 배열의 중간 index | |
mergeSort(arr, startIndex, middleIdex); // [startIndex, middleIdex) 반열린구간 | |
mergeSort(arr, middleIdex, last); // [middleIdex, last) 반열린구간 | |
merge(arr, startIndex, middleIdex, last); | |
} | |
/** | |
* 합병하는 알고리즘입니다. | |
* @param arr | |
* @param startIndex | |
* @param middleIdex | |
* @param last | |
*/ | |
void merge(int[] arr, int startIndex, int middleIdex, int last) { | |
// 선조건 : arr[startIndex...middleIdex-1] 과 arr[middleIdex...last-1] 은 오름차순이다. | |
// 후조건 : arr[startIndex...last-1] 은 오름차순이다. | |
if(arr[middleIdex -1] <= arr[middleIdex]) return; | |
int i = startIndex, j = middleIdex, k = 0; // k는 합병된 원소의 개수입니다. | |
int[] tempArr = new int[last - startIndex]; // 합병할때만 사용하는 임시 배열 | |
while (i < middleIdex && j < last) // main loop | |
if(arr[i] < arr[j]) tempArr[k++] = arr[i++]; | |
else tempArr[k++] = arr[j++]; | |
if(i < middleIdex) System.arraycopy(arr, i, arr, startIndex + k, middleIdex - i); | |
// shift arr[i...midddleIndex - 1] | |
System.arraycopy(tempArr, 0, arr, startIndex, k); // copy tempArray[0...k-1] to arr[p...p+k-1] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment