public class Main {
public static void main(String[] args) {
Solution solution = new Solution();
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:ms");
// list 초기화 (10만 개의 양수)
int[] list = new int[100000];
Random random = new Random();
for (int i = 0; i < list.length; i++) {
list[i] = Math.abs(random.nextInt()); // 음수가 아닌 값 생성
}
Date now = new Date();
String start = sdf1.format(now);
int[] result = solution.solution(list);
Date now2 = new Date();
String end = sdf1.format(now2);
System.out.println(start);
System.out.println(end);
System.out.println((now2.getTime() - now.getTime()) / 1000.0 + "초");
// 결과 출력
for (int i = 0; i < result.length; i++) {
System.out.print(result[i]);
}
}
}
class Solution {
public int[] solution(int[] numList) {
int size = numList.length - 1;
mergeSort(numList, 0, size);
return numList;
}
void mergeSort(int[] numList, int left, int right) {
int mid = 0;
if (left < right) {
// (left+right)/2 오버플로우 해결하기 위한 방법
mid = left + (right - left) / 2;
mergeSort(numList, left, mid);
mergeSort(numList, mid + 1, right);
merge(numList, left, mid, right);
}
}
void merge(int[] list, int left, int mid, int right) {
int[] sorted = new int[list.length];
int i, j, k, l;
i = left;
j = mid + 1;
k = left;
/* 분할 정렬된 list의 합병 */
while (i <= mid && j <= right) {
if (list[i] <= list[j])
sorted[k++] = list[i++];
else
sorted[k++] = list[j++];
}
// 남아 있는 값들을 일괄 복사
if (i > mid) {
for (l = j; l <= right; l++)
sorted[k++] = list[l];
}
// 남아 있는 값들을 일괄 복사
else {
for (l = i; l <= mid; l++)
sorted[k++] = list[l];
}
// 배열 sorted[](임시 배열)의 리스트를 배열 list[]로 재복사
for (l = left; l <= right; l++)
System.arraycopy(sorted, left, list, left, right - left + 1);
}
}
출처 : https://gmlwjd9405.github.io/2018/05/08/algorithm-merge-sort.html - [알고리즘] 합병 정렬(merge sort)이란
출처 : https://www.youtube.com/watch?v=y0ToATXjYHY - 병합정렬(merge sort) | C언어 코드 작성 | 분할 정복 알고리즘 - O(NlogN) 허니c코딩