= Merge Sort (병합 정렬) =
{{tag>Algorithm Sort}}
A[p ... r]을 정렬한다.
{
if(p < r) then {
q ← (p+r)/2 // 1.중간 지점 계산
mergeSort(A, p, q); // 2-1. 전반부 정렬
mergeSort(A, q+1, r) // 2-2. 후반부 정렬
merge(A, p, q, r); // 3. 병합
}
}
merge(A[], p, q, r)
{
정렬된 부분배열 2-1, 2-2를 병합 후
재정렬, 하나의 배열로 만든다.
}
== Java 구현 ==
import java.util.ArrayList;
public class MergeSort {
public static void main(String[] args) {
int[] arr = {100, 99, 97, 1, 3, 0, -15, 30, 36/6, 7, 2};
mergeSort(arr, 0, arr.length-1);
for (int i = 0; i < arr.length; i++)
System.out.println(arr[i] + " ");
}
private static void mergeSort(int[] arr, int startIndex, int endIndex) {
if (startIndex < endIndex) {
int middleIndex = (startIndex + endIndex) / 2;
mergeSort(arr, startIndex, middleIndex);
mergeSort(arr, middleIndex + 1, endIndex);
merge(arr, startIndex, middleIndex, endIndex);
} else
return;
}
/**
1. 두 배열을 합한 크기만큼의 비어있는 임시 배열 준비
2. 첫번째 요소끼리 비교하여 작은 요소를 "1"에 추가. 정렬된 원소 삭제.
3. 양쪽 배열이 빌 때까지 "2" 반복.
*/
private static void merge(int[] arr, int startIndex, int middleIndex, int endIndex) {
int L_startIndex = startIndex;
int R_startIndex = middleIndex + 1;
int tempList_index = 0;
ArrayList tempList = new ArrayList(); // 동적 배열
while (L_startIndex <= middleIndex && R_startIndex <= endIndex) {
if (arr[L_startIndex] < arr[R_startIndex])
tempList.add(arr[L_startIndex++]);
else
tempList.add(arr[R_startIndex++]);
}
while (L_startIndex <= middleIndex)
tempList.add(arr[L_startIndex++]);
while (R_startIndex <= endIndex)
tempList.add(arr[R_startIndex++]);
while (startIndex <= endIndex)
arr[startIndex++] = tempList.get(tempList_index++);
tempList.removeAll(tempList); // 원소 전부 제거
}
}
== C 구현 ==
#include
#include
void mergeSort(int arr[], int start_index, int end_index);
void merge(int arr[], int start_index, int middle_Index, int end_index);
void main() {
int arr[] = {100, 99, 97, 1, 3, 0, -15, 30, 36/6, 7, 2};
int length = sizeof(arr)/sizeof(int);
int i=0;
mergeSort(arr, 0, length-1);
for (i=0 ; i= end_index, 원소가 딱 하나 남았을 때 탈출!
}
/**
1. 두 배열을 합한 크기만큼의 비어있는 임시 배열 준비
2. 첫번째 요소끼리 비교하여 작은 요소를 "1"에 추가. 정렬된 원소 삭제.
3. 양쪽 배열이 빌 때까지 "2" 반복.
**/
void merge(int arr[], int start_index, int middle_index, int end_index)
{
int LStart_index = start_index; //전반부 시작 인덱스
int RStart_index = middle_index+1; //후반부 시작 인덱스
int* tempArr = (int*) malloc(sizeof(int) * (end_index - start_index+1)); // 1. 동적 배열 준비
int tempArr_index = 0;
while(LStart_index <= middle_index && RStart_index <= end_index) {
if(arr[LStart_index] < arr[RStart_index])
tempArr[tempArr_index++] = arr[LStart_index++];
else
tempArr[tempArr_index++] = arr[RStart_index++];
}
while (LStart_index <= middle_index)
tempArr[tempArr_index++] = arr[LStart_index++];
while (RStart_index <= end_index)
tempArr[tempArr_index++] = arr[RStart_index++];
// 2-1. "원배열 = 임시 배열" 복사.
tempArr_index = 0;
while (start_index <= end_index)
arr[start_index++] = tempArr[tempArr_index++];
free(tempArr); // 2-2. 원소 삭제
}