알고리즘의 성능을 나타내는 척도
특정 크기 입력에 대해 알고리즘의 수행 시간 분석
특정 크기 입력에 대해 알고리즘의 메모리 사용량 분석
알고리즘의 성능을 표기하는 방법으로 가장 빠르게 증가하는 항을 고려하는 표기법
(x³)
public class Merge_Sort {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// 배열 입력 파트
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int idx = st.countTokens();
int[] arr = new int[idx];
for(int i=0; i<idx;i++){
arr[i] = Integer.parseInt(st.nextToken());
}
mergeSort(arr, 0, arr.length-1);
for(int i=0; i<idx; i++){
System.out.print(arr[i] + " ");
}
}
// 분할
public static void mergeSort(int[] arr, int left, int right){
if (left < right) {
int mid = (left + right) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
}
// 정렬하면서 합치기
public static void merge(int[] arr, int left, int mid, int right){
int[] temp = new int[arr.length];
int i = left;
int j = mid + 1;
int k = left;
System.out.println("[merge] " + left + " " + mid + " " + right);
System.out.println("[merge] " + "i : " + i + " ,j : " + j + " ,k : " + k);
// 좌분할의 첫 원소와 우분할의 첫 원소를 비교해서 둘 중 더 작은 원소를 temp에 넣는다.
// 넣고 난 후 다음 원소와 큰 원소를 다시 비교한다.
while (i <= mid && j <= right) {
if (arr[i] <= arr[j]) {
temp[k] = arr[i];
i++;
} else {
temp[k] = arr[j];
j++;
}
k++;
}
// 분할된 양쪽 배열 중 남은 배열의 원소들을 temp에 차례대로 넣는다.
while (i <= mid) {
temp[k] = arr[i];
i++;
k++;
}
while (j <= right) {
temp[k] = arr[j];
j++;
k++;
}
// 정렬된 temp 배열을 arr로 옮긴다.
for (int idx = left; idx <= right; idx++) {
arr[idx] = temp[idx];
System.out.print(arr[idx] + " ");
}
System.out.println();
}
}
완전 이진트리의 일종, 우선순위 큐를 위한 자료구조
완전 이진트리 : 왼쪽부터 순서대로 채워진 이진트리
최소 힙트리 혹은 최대 힙트리를 구성한 후 하나씩 요소를 꺼내 배열에 저장하는 방식
최소 힙 트리 : 부모 노드가 자식 노드보다 작거나 같다.
최대 힙 트리 : 부모 노드가 자식 노드보다 크거나 같다
이진 탐색 트리를 구성한 후 중위 순회 방법으로 순회하면서 정렬하는 방법
낮은 자리부터 비교해서 정렬하는 방법
해당 숫자 인덱스를 추가하는 방식으로 정렬하는 방법
Arrays.sort()
평균 O(NlogN) 최악 O(N^2)
Collections.sort()
평균 O(NlogN) 최악 O(NlogN)
메모리를 추가 사용함
삽입, 병합 정렬 사용