堆排序
时间复杂度O(nlogn)
空间复杂度O(1)
- 把数组中的元素插入到大根堆,大根堆只保证堆顶元素为最大值,但是整体不保证有序。
- 把堆顶元素与最后一个元素交换,同时堆长度heapsize减一
- 把交换过后的0到heapsize的元素大根堆化,再重复第二步,直到heapsize的元素为1
建堆
- 建立堆的时间复杂度O(n)
- heapsert函数是用来建立插入元素同时保证大根堆结构,
当前值从最后一个位置开始,每次与父节点比较大小,如果当前值比父节点大,则交换父节点直到当前值小于等于父节点。父节点为(index-1)//2 - heapify函数是用来把当前长度内的元素大根堆化
当前值从根开始,每次与左右孩子中的较大值做交换,当当前没有做交换时则停止。
左孩子为2index+1,右孩子为2index+2
def heapSort(arr):
for i in range(len(arr)):
heapInsert(arr, i) #先把所有值插入到大根堆中
heapsize = len(arr)
heapsize = heapsize -1
swap(arr,0,heapsize) #把堆顶最大值换到数组末尾
while heapsize > 0