1
- // Heap sort
1
+ // https://en.wikipedia.org/wiki/Heapsort
2
+
3
+ let swap = ( arr , orig , dest ) => {
4
+ let temp = arr [ orig ]
5
+ arr [ orig ] = arr [ dest ]
6
+ arr [ dest ] = temp
7
+ }
8
+
9
+ let maxHeapify = ( arr , i , n ) => {
10
+ let left = 2 * i + 1 ,
11
+ rigth = 2 * i + 2 ,
12
+ largest = i
13
+
14
+ if ( left < n && arr [ left ] > arr [ i ] ) {
15
+ largest = left
16
+ }
17
+ if ( rigth < n && arr [ rigth ] > arr [ largest ] ) {
18
+ largest = rigth
19
+ }
20
+ if ( largest !== i ) {
21
+ swap ( arr , i , largest )
22
+ maxHeapify ( arr , largest , n )
23
+ }
24
+ }
25
+
26
+ let buildMaxHeap = ( arr , n ) => {
27
+ let len = Math . floor ( ( n - 1 ) / 2 )
28
+ for ( let i = len ; i >= 0 ; i -- ) {
29
+ maxHeapify ( arr , i , n )
30
+ }
31
+ }
32
+
33
+ let heapSort = ( arr ) => {
34
+ let n = arr . length
35
+ buildMaxHeap ( arr , n )
36
+ for ( let i = arr . length - 1 ; i > 0 ; i -- ) {
37
+ swap ( arr , i , 0 )
38
+ maxHeapify ( arr , 0 , -- n )
39
+ }
40
+
41
+ return arr
42
+ }
43
+
44
+ const test = require ( 'tape' )
45
+
46
+ // test('maxHeapify', assert => {
47
+ // assert.deepEqual(maxHeapify([27,17,3,16,13,10,1,5,7,12,4,8,9,0], 2),
48
+ // [27,17,10,16,13,9,1,5,7,12,4,8,3,0])
49
+ // assert.deepEqual(maxHeapify([16,4,10,14,7,9,3,2,8,1], 1),
50
+ // [16,14,10,8,7,9,3,2,4,1])
51
+ // assert.deepEqual(maxHeapify([16,14,10,8,1,9,3,2,4,7], 4),
52
+ // [16,14,10,8,7,9,3,2,4,1])
53
+ // assert.end()
54
+ // })
55
+
56
+ // test('buildMaxHeap', assert => {
57
+ // assert.deepEqual(buildMaxHeap([4,1,3,2,16,9,10,14,8,7]),
58
+ // [16,14,10,8,7,9,3,2,4,1])
59
+ // assert.end()
60
+ // })
61
+
62
+ test ( 'heapSort' , assert => {
63
+ assert . deepEqual ( heapSort ( [ 4 , 1 , 3 , 2 , 16 , 9 , 10 , 14 , 8 , 7 ] ) ,
64
+ [ 1 , 2 , 3 , 4 , 7 , 8 , 9 , 10 , 14 , 16 ] )
65
+ assert . end ( )
66
+ } )
0 commit comments