일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- db
- support 라이브러리
- 소수 알고리즘
- android support
- 백준
- android adapterview
- 자바 컬렉션
- 소수
- android fragment
- 컬렉션
- SQLite와 Realm 차이점
- 깊이우선탐색
- java
- anr
- 액티비티 ANR
- support fragment
- 너비우선탐색
- 백준 알고리즘
- 안드로이드
- 자료구조
- Github
- 알고리즘
- oracle
- 안드로이드 DBMS
- DFS
- 안드로이드 ANR
- BFS
- 안드로이드 AdapterView
- application not responding
- 안드로이드 파일
Archives
- Today
- Total
밍의 기록들😉
[정렬] 합병 정렬 (Merge Sort) - 개념, 시간복잡도, 구현 본문
합병 정렬 개념
배열을 절반으로 나누어 각각을 정렬한 후, 합친다.
합병 정렬의 시간복잡도
재귀적으로 구해야 한다.
1. 왼쪽 합병정렬 = T(n/2)
2. 오른쪽 합병정렬 = T(n/2)
3. 합친다 = O(n)
* T(n) = n개의 숫자를 합병정렬할 때의 시간복잡도
* T(n) = 2 x T(n/2) + O(n) // 점화식
= 2(2T(n/4) + O(n/2)) + O(n)
= 4T(n/4) + 2O(n) // 1번 대입
= 4(2T(n/8) + O(n/4)) + 2O(n)
= 8T(n/8) + 3O(n) // 2번 대입
...... // k번 대입 k+1 = log n
= n x T(1) + log n x O(n)
= n x O(1) + O(n log n)
= O(n) + O(n log n)
*
합병 정렬 구현 코드
import java.util.Scanner; public class SortMerge { // 합병정렬 : 배열을 절반으로 나누어 각각을 정렬한 후, 합침 public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] data = new int [100]; for(int i=0; i<n; i++){ data[i] = sc.nextInt(); } mergeSort(data, 0, n-1); for(int i=0; i<n; i++){ System.out.print(data[i]+" "); } } // data의 start부터 end까지를 합병정렬하는 함수 private static void mergeSort(int[] data, int start, int end) { if(start >= end) // 숫자가 한 개 남았을 때 return; else{ int mid = (start+end)/2; mergeSort(data, start, mid); // 1. 왼쪽 절반 합병정렬 mergeSort(data, mid+1, end); // 2. 오른쪽 절반 합병정렬 merging(data, start, mid, mid+1, end);// 3. 둘을 합침 } } // 정렬된 반쪽들을 정렬해서 하나로 합치는 함수 private static void merging(int[] data, int s1, int e1, int s2, int e2) { int p, q; // 현재 최솟값을 가리키는 변수들 int [] temp = new int[100]; // 합쳐진 결과를 저장하는 임시배열 int tempIndex = 0; p = s1; // 왼쪽 절반의 시작점 q = s2; // 오른쪽 절반의 시작점 while(p <= e1 && q <= e2) { if(data[p] <= data[q]){ temp[tempIndex++] = data[p]; p++; } else{ temp[tempIndex++] = data[q]; q++; } } if(p > e1){// q에 남은 숫자가 있는 경우 for(int i=q; i<=e2; i++){ temp[tempIndex++] = data[i]; } } else{// p에 남은 숫자가 있는 경우 for(int i=p; i<=e1; i++){ temp[tempIndex++] = data[i]; } } // temp[] 완성이 되었으니 data[]에 복사 for(int i=s1; i<=e2; i++){ data[i] = temp[i-s1]; //data[] 는 0부터 시작하는 것이 아님, temp는 0부터 시작 } } }
'자료구조, 알고리즘 > 기본다지기' 카테고리의 다른 글
[정렬] 퀵 정렬 (Quick Sort) - 개념, 시간복잡도, 구현 (0) | 2018.09.10 |
---|---|
[정렬] 선택 정렬, 삽입 정렬, 버블 정렬의 구현 (0) | 2018.09.10 |
[트리] 트리의 순회 (0) | 2018.09.09 |
[트리] 트리의 표현 (0) | 2018.09.09 |
[트리] 트리의 기본 (0) | 2018.09.09 |
Comments