堆排序的宗旨是:建立一个最大堆,然后堆顶元素为最大元素,依次将堆顶元素放在列表最后,即将第一个元素与最后一个元素交换,交换之后剩余部分再堆排序,直到只剩堆顶。
难点:如何建立最大堆:将列表元素标号,则最大堆满足,k(i)>=k(2i+1),k(i)>=k(2i+2),根据这个规则,从有叶子节点开始,从下往上依次选最大的放堆顶。
堆排序也是一个不稳定排序,其时间复杂度为O(nlogn),空间复杂度为O(1)
def heap_sort(nums):
size=len(nums)
build_heap(nums,size)
for i in range(size-1,-1,-1):
nums[0],nums[i]-nums[i],nums[0]
adjust_heap(nums,0,i)
def build_heap(nums,size):
for i in range(size//2-1,-1,-1):
adjust_heap(nums,i,size)
def adjust_heap(nums,i,size):
left=2*i+1
right=left+1
max=i
if i<size/2:
if left<size and nums[max]<nums[left]:
max=left
if right<size and nums[right]>nums[max]:
max=right
if max!=i:
nums[max],nums[i]=nums[i],nums[max]
adjust_heap(nums,max,size)