Skip to content

Commit 237cc0e

Browse files
committed
add HeapSort
1 parent 369c2ec commit 237cc0e

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package io.algocasts;
2+
3+
public class HeapSort {
4+
5+
private void swap(int[] arr, int i, int j) {
6+
int tmp = arr[i];
7+
arr[i] = arr[j];
8+
arr[j] = tmp;
9+
}
10+
11+
// Time: O(log(n))
12+
private void siftDown(int[] arr, int i, int end) {
13+
int parent = i, child = 2 * parent + 1;
14+
while (child <= end) {
15+
if (child+1 <= end && arr[child+1] > arr[child]) ++child;
16+
if (arr[parent] >= arr[child]) break;
17+
swap(arr, parent, child);
18+
parent = child;
19+
child = 2 * parent + 1;
20+
}
21+
}
22+
23+
// i 从 end/2 开始即可,因为在二叉堆中,更大的 i 是没有子节点的,没必要做 siftDown
24+
// Time: O(n)
25+
// Reference:
26+
// * https://www.geeksforgeeks.org/time-complexity-of-building-a-heap/
27+
// * https://www2.cs.sfu.ca/CourseCentral/307/petra/2009/SLN_2.pdf
28+
private void buildMaxHeap(int[] arr, int end) {
29+
for (int i = end/2; i >= 0; --i) {
30+
siftDown(arr, i, end);
31+
}
32+
}
33+
34+
// Time: O(n*log(n)), Space: O(1)
35+
public void sort(int[] arr) {
36+
if (arr == null || arr.length == 0) return;
37+
buildMaxHeap(arr, arr.length - 1);
38+
for (int end = arr.length - 1; end > 0; --end) {
39+
swap(arr, 0, end);
40+
siftDown(arr, 0, end - 1);
41+
}
42+
}
43+
44+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package io.algocasts;
2+
3+
import org.junit.Test;
4+
5+
public class HeapSortTest extends SortTest {
6+
7+
@Test
8+
public void test() {
9+
HeapSort h = new HeapSort();
10+
test(h::sort);
11+
}
12+
13+
}

0 commit comments

Comments
 (0)