1 堆排序(Heapsort)
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。
二叉堆本质上是一种完全二叉树,它分为两个类型:最大堆和最小堆。最大堆任何一个父节点的值,都大于等于它左右孩子节点的值。最小堆任何一个父节点的值,都小于等于它左右孩子节点的值。二叉堆的根节点叫做堆顶。最大堆和最小堆的特点,决定了在最大堆的堆顶是整个堆中的最大元素;最小堆的堆顶是整个堆中的最小元素。
算法描述
- 将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区;
- 将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n];
- 由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,……Rn-1)调整为新堆,- 然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2….Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。
动图演示
代码实现
class Solution:
def sortArray(self, nums: List[int]) -> List[int]:
n = len(nums)
if not nums or n==0: return []
# 初始化建立大顶堆
for i in range(n//2-1, -1, -1):
self.maxHeapify(nums, n, i)
# 取出堆顶元素
for i in range(n-1, -1, -1):
temp = nums[0]
nums[0] = nums[i]
nums[i] = temp
self.maxHeapify(nums, i, 0)
return nums
def maxHeapify(self, nums, length, i):
left, right = 2*i+1, 2*i+2
largest = i
if left < length and nums[left] > nums[largest]:
largest = left
if right < length and nums[right] > nums[largest]:
largest = right
if largest != i:
temp = nums[i]
nums[i] = nums[largest]
nums[largest] = temp
self.maxHeapify(nums, length, largest)
使用python内置的堆数据结构来排序:
import heapq
class Solution:
def sortArray(self, nums: List[int]) -> List[int]:
heap, res = [], []
for i in nums:
heapq.heappush(heap,i)
while heap:
res.append(heapq.heappop(heap))
return res
算法特性
- 时间复杂度(最好): O ( n l o g n ) O(nlogn) O(nlogn)
- 时间复杂度(最坏): O ( n l o g n ) O(nlogn) O(nlogn)
- 时间复杂度(平均): O ( n l o g n ) O(nlogn) O(nlogn)
- 空间复杂度: O ( 1 ) O(1) O(1)
- 稳定性:不稳定