堆排序算法:空间复杂度为O(1),时间复杂度为O(nlogn),算法不稳定,不具有适应性
1、构造初始堆:对所有的非叶子节点进行筛选(小顶堆向下筛选,大顶堆向上筛选)
2、进行堆排序:交换堆顶和最后一个元素,最后一个元素为有序区,剩下的为无序区,调整无序区,变成堆之后,
堆无序区交换堆顶和最后一个元素,以此类推
算法的稳定性是指:对于待排序的序列中,相同项的原来次序不能被改变
算法的适应性是指:算法因原序列有序而更高效
def heap_sort(lst):
def siftdown(lst, e, begin, end):
i, j = begin, begin * 2 + 1
while j < end:
if j + 1 < end and lst[j + 1] < lst[j]:
j += 1
if e < lst[j]:
break
lst[i] = lst[j]
i, j = j, 2 * j + 1
lst[i] = e
end = len(lst)
for i in range((end)//2, -1, -1):
siftdown(lst, lst[i], i, end)
print 'lst: ', lst
for i in range((end - 1), 0, -1):
e = lst[i]
print e
lst[i] = lst[0]
print 'lst1: ', lst
siftdown(lst, e, 0, i)
print 'lst2: ', lst
print '***'
print 'lst3: ', lst