1
+ #O(LogN), used when part of the array is already heapified.
2
+ def heapify (A , N , i ):
3
+ largest = i
4
+ l = i * 2 + 1
5
+ r = i * 2 + 2
6
+
7
+ if l < N and A [l ]> A [largest ]: largest = l
8
+ if r < N and A [r ]> A [largest ]: largest = r
9
+ if largest != i :
10
+ A [largest ], A [i ] = A [i ], A [largest ]
11
+ heapify (A , N , largest )
12
+
13
+ #O(NLogN)
1
14
def heapSort (A ):
2
- #build max heap
3
- def heapify (A , n , i ):
4
- if i >= n : return
5
- l , r = i * 2 + 1 , i * 2 + 2
6
- left = A [l ] if l < n else float ('-inf' )
7
- right = A [r ] if r < n else float ('-inf' )
8
-
9
- if left > A [i ] or right > A [i ]:
10
- if left > right :
11
- A [i ], A [l ] = A [l ], A [i ]
12
- heapify (A , n , l )
13
- else :
14
- A [i ], A [r ] = A [r ], A [i ]
15
- heapify (A , n , r )
16
-
17
- n = len (A )
18
-
19
- for i in reversed (xrange (n )):
20
- heapify (A , n , i )
21
-
22
- for i in reversed (xrange (1 , n )):
23
- A [i ], A [0 ] = A [0 ], A [i ]
15
+ N = len (A )
16
+
17
+ #build max heap, O(NLogN). Can be optimized to the O(N).
18
+ for i in range (N // 2 - 1 , - 1 , - 1 ):
19
+ heapify (A , N , i )
20
+
21
+ #keep swapping the largest
22
+ for i in range (N - 1 , - 1 , - 1 ):
23
+ A [0 ], A [i ] = A [i ], A [0 ]
24
24
heapify (A , i , 0 )
25
25
26
26
27
-
28
- A = [21 , 4 , 1 , 3 , 9 , 20 , 25 , 6 , 21 , 14 ]
27
+ A = [12 , 11 , 13 , 5 , 6 , 7 ]
29
28
heapSort (A )
30
- print A
29
+ print ( A )
31
30
32
- """
33
- Time Complexity O(NLogN) in best, average, worst case.
34
- Space Complexity O(1)
35
- """
31
+ A = [1 , 3 , 5 , 4 , 6 , 13 , 10 , 9 , 8 , 15 , 17 ]
32
+ heapSort (A )
33
+ print (A )
0 commit comments