File tree Expand file tree Collapse file tree 2 files changed +57
-0
lines changed Expand file tree Collapse file tree 2 files changed +57
-0
lines changed Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
You can’t perform that action at this time.
0 commit comments