반응형
- 여러 개의 정렬된 자료의 집합을 병합하여 한 개의 정렬된 집합으로 만드는 방식
- 분할 정복 알고리즘 활용
- 자료를 최소 단위의 문제까지 나눈 후에 차례대로 정렬하여 최 종 결과를 얻어냄
- top-down방식 - 시간복잡도 : O(nlogn)
구현코드
package array2;
import java.util.Arrays;
public class MergeSort {
public static int[] a = {69,10,30,2,16,8,31,22};
public static int[] s = new int[a.length];
public static void merge(int left,int mid, int right) {
int i = left;
int j = mid + 1;
int k = left;
while(i <= mid && j <= right) {
if(a[i] <= a[j]) s[k++] = a[i++];
else s[k++] = a[j++];
}
if(i>mid) for(int l=j; l<= right ; l++) s[k++] = a[l];
else for(int l=i; l<= mid ; l++) s[k++] = a[l];
for(int l = left; l<= right; l++) a[l] = s[l];
}
public static void mergesort(int left, int right) {
if(left < right) {
int mid = (left+right)/2;
mergesort(left,mid);
mergesort(mid+1,right);
merge(left,mid,right);
System.out.println(Arrays.toString(a));
}
}
public static void main(String[] args) {
System.out.println(Arrays.toString(a));
mergesort(0, a.length-1);
}
}
MergeSort(ArrayList)
package array1;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class MergeSort {
public static int[] a = { 69, 10, 30, 2, 16, 8, 31, 22 };
public static int[] s = new int[a.length];
public static List<Integer> merge(List<Integer> left, List<Integer> right) {
List<Integer> r = new ArrayList<>();
while (left.size() > 0 || right.size() > 0) {
if (left.size() > 0 && right.size() > 0) {
if (left.get(0) <= right.get(0))
r.add(left.remove(0));
else
r.add(right.remove(0));
} else if (left.size() > 0) {
for (int i = 0; i < left.size(); i++)
r.add(left.remove(0));
} else if (right.size() > 0) {
for (int i = 0; i < right.size(); i++)
r.add(right.remove(0));
}
}
return r;
}
public static List<Integer> mergesort(List<Integer> m) {
if (m.size() == 1)
return m;
List<Integer> left = new ArrayList<>();
List<Integer> right = new ArrayList<>();
int mid = m.size() / 2;
for (int i = 0; i < mid; i++)
left.add(m.get(i));
for (int i = mid; i < m.size(); i++)
right.add(m.get(i));
left = mergesort(left);
right = mergesort(right);
return merge(left, right);
}
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < a.length; i++) {
list.add(a[i]);
}
System.out.println(list);
System.out.println(mergesort(list));
}
}
반응형
'1. 알고리즘 이론 > 3. 정렬' 카테고리의 다른 글
퀵정렬(QuickSort) (0) | 2020.03.01 |
---|---|
카운팅정렬(CountingSort) (0) | 2020.03.01 |
삽입정렬(InsertionSort) (0) | 2020.03.01 |
선택정렬(SelectionSort) (0) | 2020.03.01 |
버블정렬(BubbleSort) (0) | 2020.03.01 |