11class Solution :
2- # 调整为小顶堆
3- def heapify (self , nums : [int ], index : int , end : int ):
4- left = index * 2 + 1
5- right = left + 1
6- while left <= end :
7- # 当前节点为非叶子结点
8- min_index = index
9- if nums [left ] < nums [min_index ]:
10- min_index = left
11- if right <= end and nums [right ] < nums [min_index ]:
12- min_index = right
13- if index == min_index :
14- # 如果不用交换,则说明已经交换结束
15- break
16- nums [index ], nums [min_index ] = nums [min_index ], nums [index ]
17- # 继续调整子树
18- index = min_index
19- left = index * 2 + 1
20- right = left + 1
21-
22-
23- # 初始化小顶堆
24- def buildMinHeap (self , nums : [int ]):
25- size = len (nums )
26- # (size - 2) // 2 是最后一个非叶节点,叶节点不用调整
27- for i in range ((size - 2 ) // 2 , - 1 , - 1 ):
28- self .heapify (nums , i , size - 1 )
29- return nums
30-
31-
32- # 升序堆排序,思路如下:
33- # 1. 先建立小顶堆
34- # 2. 让堆顶最小元素与最后一个交换,然后调整第一个元素到倒数第二个元素,这一步获取最小值
35- # 3. 再交换堆顶元素与倒数第二个元素,然后调整第一个元素到倒数第三个元素,这一步获取第二小值
36- # 4. 以此类推,直到最后一个元素交换之后完毕。
37- def minHeapSort (self , nums : [int ]):
38- self .buildMinHeap (nums )
39- size = len (nums )
40- for i in range (size ):
41- nums [0 ], nums [size - i - 1 ] = nums [size - i - 1 ], nums [0 ]
42- self .heapify (nums , 0 , size - i - 2 )
43- return nums
44-
45- # 升序堆排序,思路如下:
46- # 1. 先建立大顶堆
47- # 2. 让堆顶最大元素与最后一个交换,然后调整第一个元素到倒数第二个元素,这一步获取最大值
48- # 3. 再交换堆顶元素与倒数第二个元素,然后调整第一个元素到倒数第三个元素,这一步获取第二大值
49- # 4. 以此类推,直到最后一个元素交换之后完毕。
50- def maxHeapSort (self , arr : [int ]):
51- self .buildMaxHeap (arr )
52- size = len (arr )
53- for i in range (size ):
54- arr [0 ], arr [size - i - 1 ] = arr [size - i - 1 ], arr [0 ]
55- self .heapify (arr , 0 , size - i - 2 )
56- return arr
57-
58- def sortArray (self , nums : List [int ]) -> List [int ]:
59- return self .maxHeapSort (nums )
2+ # 调整为小顶堆
3+ def heapify (self , nums : [int ], index : int , end : int ):
4+ left = index * 2 + 1
5+ right = left + 1
6+ while left <= end :
7+ # 当前节点为非叶子结点
8+ min_index = index
9+ if nums [left ] < nums [min_index ]:
10+ min_index = left
11+ if right <= end and nums [right ] < nums [min_index ]:
12+ min_index = right
13+ if index == min_index :
14+ # 如果不用交换,则说明已经交换结束
15+ break
16+ nums [index ], nums [min_index ] = nums [min_index ], nums [index ]
17+ # 继续调整子树
18+ index = min_index
19+ left = index * 2 + 1
20+ right = left + 1
21+
22+
23+ # 初始化小顶堆
24+ def buildMinHeap (self , nums : [int ]):
25+ size = len (nums )
26+ # (size - 2) // 2 是最后一个非叶节点,叶节点不用调整
27+ for i in range ((size - 2 ) // 2 , - 1 , - 1 ):
28+ self .heapify (nums , i , size - 1 )
29+ return nums
30+
31+
32+ # 升序堆排序,思路如下:
33+ # 1. 先建立小顶堆
34+ # 2. 让堆顶最小元素与最后一个交换,然后调整第一个元素到倒数第二个元素,这一步获取最小值
35+ # 3. 再交换堆顶元素与倒数第二个元素,然后调整第一个元素到倒数第三个元素,这一步获取第二小值
36+ # 4. 以此类推,直到最后一个元素交换之后完毕。
37+ def minHeapSort (self , nums : [int ]):
38+ self .buildMinHeap (nums )
39+ size = len (nums )
40+ for i in range (size ):
41+ nums [0 ], nums [size - i - 1 ] = nums [size - i - 1 ], nums [0 ]
42+ self .heapify (nums , 0 , size - i - 2 )
43+ return nums
44+
45+ # 升序堆排序,思路如下:
46+ # 1. 先建立大顶堆
47+ # 2. 让堆顶最大元素与最后一个交换,然后调整第一个元素到倒数第二个元素,这一步获取最大值
48+ # 3. 再交换堆顶元素与倒数第二个元素,然后调整第一个元素到倒数第三个元素,这一步获取第二大值
49+ # 4. 以此类推,直到最后一个元素交换之后完毕。
50+ def maxHeapSort (self , arr : [int ]):
51+ self .buildMaxHeap (arr )
52+ size = len (arr )
53+ for i in range (size ):
54+ arr [0 ], arr [size - i - 1 ] = arr [size - i - 1 ], arr [0 ]
55+ self .heapify (arr , 0 , size - i - 2 )
56+ return arr
57+
58+ def sortArray (self , nums : List [int ]) -> List [int ]:
59+ return self .maxHeapSort (nums )
0 commit comments