-
Notifications
You must be signed in to change notification settings - Fork 1
/
heap_sort.java
99 lines (82 loc) ยท 3.53 KB
/
heap_sort.java
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
public class heap_sort {
// ๋ถ๋ชจ ์ธ๋ฑ์ค๋ฅผ ์ป๋ ํจ์
private static int getParent(int child) {
return (child - 1) / 2;
}
// ๋ ์ธ๋ฑ์ค์ ์์๋ฅผ ๊ตํํ๋ ํจ์
private static void swap(int[] a, int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
// ์ฃผ์ด์ง ๋ฐฐ์ด a -> max heap ์๋ฃ๊ตฌ์กฐ๋ก ๋ฐ๊พธ๋ ํจ์ : heapify
private static void heapify(int[] a, int parentIdx, int lastIdx) {
/*
* ํ์ฌ ํธ๋ฆฌ์์ ๋ถ๋ชจ ๋
ธ๋์ ์์๋
ธ๋ ์ธ๋ฑ์ค๋ฅผ ๊ฐ๊ฐ ๊ตฌํด์ค๋ค.
* ํ์ฌ ๋ถ๋ชจ ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ฅ ํฐ ๊ฐ์ ๊ฐ๊ณ ์๋ค๊ณ ๊ฐ์ ํ๋ค.
*/
int leftChildIdx = 2 * parentIdx + 1;
int rightChildIdx = 2 * parentIdx + 2;
int largestIdx = parentIdx;
/*
* left child node์ ๋น๊ต
*
* ์์๋
ธ๋ ์ธ๋ฑ์ค๊ฐ ๋์ ์์ ์ธ๋ฑ์ค๋ฅผ ๋์ด๊ฐ์ง ์์ผ๋ฉด์
* ํ์ฌ ๊ฐ์ฅ ํฐ ์ธ๋ฑ์ค๋ณด๋ค ์ผ์ชฝ ์์๋
ธ๋์ ๊ฐ์ด ๋ ํด๊ฒฝ์ฐ
* ๊ฐ์ฅ ํฐ ์ธ๋ฑ์ค๋ฅผ ๊ฐ๋ฆฌํค๋ largestIdx๋ฅผ ์ผ์ชฝ ์์๋
ธ๋์ธ๋ฑ์ค๋ก ๋ฐ๊ฟ์ค๋ค.
*
*/
if(leftChildIdx < lastIdx && a[largestIdx] < a[leftChildIdx]) {
largestIdx = leftChildIdx;
}
/*
* left right node์ ๋น๊ต
*
* ์์๋
ธ๋ ์ธ๋ฑ์ค๊ฐ ๋์ ์์ ์ธ๋ฑ์ค๋ฅผ ๋์ด๊ฐ์ง ์์ผ๋ฉด์
* ํ์ฌ ๊ฐ์ฅ ํฐ ์ธ๋ฑ์ค๋ณด๋ค ์ค๋ฅธ์ชฝ์ชฝ ์์๋
ธ๋์ ๊ฐ์ด ๋ ํด๊ฒฝ์ฐ
* ๊ฐ์ฅ ํฐ ์ธ๋ฑ์ค๋ฅผ ๊ฐ๋ฆฌํค๋ largestIdx๋ฅผ ์ค๋ฅธ์ชฝ ์์๋
ธ๋์ธ๋ฑ์ค๋ก ๋ฐ๊ฟ์ค๋ค.
*
*/
if(rightChildIdx < lastIdx && a[largestIdx] < a[rightChildIdx]) {
largestIdx = rightChildIdx;
}
/*
* largestIdx ์ ๋ถ๋ชจ๋
ธ๋๊ฐ ๊ฐ์ง ์๋ค๋ ๊ฒ์
* ์ ์์๋
ธ๋ ๋น๊ต ๊ณผ์ ์์ ํ์ฌ ๋ถ๋ชจ๋
ธ๋๋ณด๋ค ํฐ ๋
ธ๋๊ฐ ์กด์ฌํ๋ค๋ ๋ป์ด๋ค.
* ๊ทธ๋ด ๊ฒฝ์ฐ ํด๋น ์์ ๋
ธ๋์ ๋ถ๋ชจ๋
ธ๋๋ฅผ ๊ตํํด์ฃผ๊ณ ,
* ๊ตํ ๋ ์์๋
ธ๋๋ฅผ ๋ถ๋ชจ๋
ธ๋๋ก ์ผ์ ์๋ธํธ๋ฆฌ๋ฅผ ๊ฒ์ฌํ๋๋ก ์ฌ๊ท ํธ์ถ ํ๋ค.
*/
if(parentIdx != largestIdx) {
swap(a, largestIdx, parentIdx);
heapify(a, largestIdx, lastIdx);
}
}
public static void heapsort(int[] arr) {
int size = arr.length;
/*
* ๋ถ๋ชจ๋
ธ๋์ heaify๊ณผ์ ์์ ์์๊ฐ ๋ฐ์ํ๋ฉด ์๋ชป ๋ ์ฐธ์กฐ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์
* ์์๊ฐ 1๊ฐ์ด๊ฑฐ๋ 0๊ฐ์ผ ๊ฒฝ์ฐ๋ ์ ๋ ฌ ํ ํ์๊ฐ ์์ผ๋ฏ๋ก ๋ฐ๋ก ํจ์๋ฅผ ์ข
๋ฃํ๋ค.
*/
if(size < 2) {
return;
}
// ๊ฐ์ฅ ๋ง์ง๋ง ๋
ธ๋์ ๋ถ๋ชจ ๋
ธ๋ ์ธ๋ฑ์ค
int parentIdx = getParent(size - 1);
// max heap ๋ง๋ค๊ธฐ - ๋งจ ๋ง์ง๋ง์ ๋ถ๋ชจ๋
ธ๋๋ถํฐ
for(int i = parentIdx; i >= 0; i--) {
// ๋ถ๋ชจ๋
ธ๋(i๊ฐ)์ 1์ฉ ์ค์ด๋ฉด์ heap ์กฐ๊ฑด์ ๋ง์กฑ์ํค๋๋ก ์ฌ๊ตฌ์ฑํ๋ค.
; heapify(arr, i, size - 1)
}
// ์ ๊ณผ์ : max heap ๋ง๋ค๊ธฐ / ์๋ ๊ณผ์ : max heap ์ ๋ ฌํ๊ธฐ
// ์ ๋ ฌ ๊ณผ์
for(int i = size - 1; i > 0; i--) {
/*
* root์ธ 0๋ฒ์งธ ์ธ๋ฑ์ค์ i๋ฒ์งธ ์ธ๋ฑ์ค์ ๊ฐ์ ๊ตํํด์ค ๋ค
* 0 ~ (i-1) ๊น์ง์ ๋ถ๋ถํธ๋ฆฌ์ ๋ํด max heap์ ๋ง์กฑํ๋๋ก
* ์ฌ๊ตฌ์ฑํ๋ค.
*/
swap(arr, 0, i);
heapify(arr, 0, i - 1);
}
}
}