정렬2 (합병정렬, 힙정렬, 퀵정렬)
1. 합병 정렬 (Merge Sort)
- 배열을 계속 분할해서 길이가 1이 되도록 만들고, 인접한 부분끼리 정렬하면서 합병하는 방식
- 알고리즘 복잡도 : O(NlogN)
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// 알고리즘 - 정렬_2
// 합병 정렬
import java.util.Arrays;
public class Main {
public static void mergeSort(int[] arr, int[] tmp, int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
mergeSort(arr, tmp, left, mid);
mergeSort(arr, tmp, mid+1, right);
merge(arr, tmp, left, right, mid);
}
}
public static void merge(int[] arr, int[] tmp, int left, int right, int mid) {
int p = left;
int q = mid+1;
int idx = p;
while (p <= mid || q <= right) {
if (p <= mid && q <= right) {
if (arr[p] <= arr[q]) {
tmp[idx++] = arr[p++];
} else {
tmp[idx++] = arr[q++];
}
} else if (p <= mid && q > right) {
tmp[idx++] = arr[p++];
} else {
tmp[idx++] = arr[q++];
}
}
for (int i = left ; i <= right ; i++) {
arr[i] = tmp[i];
}
}
public static void main(String[] args) {
// Test code
int[] arr = {3, 5, 2, 7, 1, 4, 6};
int[] tmp = new int[arr.length];
mergeSort(arr, tmp, 0, arr.length - 1);
System.out.println("합병 정렬: " + Arrays.toString(arr));
}
}
2. 힙 정렬 (Heap Sort)
- 힙 자료구조 형태의 정렬 방식
- 기존 배열을 최대 힙으로 구조 변경 후 정렬 진행
- 알고리즘 복잡도 : O(NlogN)
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// 힙 정렬
import java.util.Arrays;
public class Main2 {
public static void heapSort(int[] arr) {
for (int i = arr.length / 2 - 1 ; i >= 0 ; i--) {
heapify(arr, i, arr.length);
}
for (int i = arr.length - 1 ; i > 0 ; i--) {
swap(arr,0, i);
heapify(arr, 0, i);
}
}
// 최대힙 기준 정렬
public static void heapify(int[] arr, int parentIdx, int size) {
int leftIdx = 2 * parentIdx + 1;
int rightIdx = 2 * parentIdx + 2;
int maxIdx = parentIdx;
if (leftIdx < size && arr[maxIdx] < arr[leftIdx]) {
maxIdx = leftIdx;
}
if (rightIdx < size && arr[maxIdx] < arr[rightIdx]) {
maxIdx = rightIdx;
}
if (parentIdx != maxIdx) {
swap(arr, maxIdx, parentIdx);
heapify(arr, maxIdx, size);
}
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void main(String[] args) {
// Test code
int[] arr = {3, 5, 2, 7, 1, 4, 6};
heapSort(arr);
System.out.println("힙 정렬: " + Arrays.toString(arr));
}
}
3. 퀵 정렬 (Quick Sort)
- 임의의 기준값(pivot)을 정하고 그 값을 기준으로 좌우로 분할하며 정렬하는 방식
- 알고리즘 복잡도
- 보통은 O(NlogN)
- 기준 값이 데이터 중 최소값이나 최대값이면 O(NlogN)
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// 퀵 정렬
import java.util.Arrays;
public class Main3 {
public static void quickSort(int[] arr, int left, int right) {
if (left >= right) {
return;
}
int pivot = partition(arr, left, right);
quickSort(arr, left, pivot - 1);
quickSort(arr, pivot + 1, right);
}
public static int partition(int[] arr, int left, int right) {
int pivot = arr[left];
int i = left;
int j = right;
while (i < j) {
while (arr[j] > pivot && i < j) {
j--;
}
while (arr[i] <= pivot && i < j) {
i++;
}
swap(arr,i,j);
}
swap(arr, left, i);
return i;
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void main(String[] args) {
int[] arr = {6, 2, 7, 9, 4, 5, 8};
quickSort(arr, 0, arr.length - 1);
System.out.println("퀵 정렬: " + Arrays.toString(arr));
}
}
This post is licensed under CC BY 4.0 by the author.