堆排序的思想
# coding: utf-8
# 时间复杂度:O(nlogn) 空间复杂度:O(1)原地排序 大顶堆
import random
import math
#随机生成0~100之间的数值
def get_andomNumber(num):
lists=[]
i=0
while i<num:
lists.append(random.randint(0,100))
i+=1
return lists
# 调整堆
# 递归的调整
def adjust_heap(lists, i, size):
lchild = 2 * i + 1
rchild = 2 * i + 2
max = i # 堆顶
if i < size / 2:
if lchild < size and lists[lchild] > lists[max]:
max = lchild
if rchild < size and lists[rchild] > lists[max]:
max = rchild
if max != i:
lists[max], lists[i] = lists[i], lists[max]
adjust_heap(lists, max, size)
# 创建堆
def build_heap(lists, size):
for i in range(0, (int(size/2)))[::-1]:
adjust_heap(lists, i, size)
# 堆排序
def heap_sort(lists):
size = len(lists)
build_heap(lists, size)
# for i in range(0, size)[::-1]: # 这种写法也证明range生成的是一个序列
for i in range(size-1, 0, -1): # 这两句等价
lists[0], lists[i] = lists[i], lists[0] # 堆顶元素与首元素交换
adjust_heap(lists, 0, i) # 交换后,需要对完全二叉树进行调整
# 这里注意是(0, i) 相当于堆顶元素变了,因为以后调整好就不再动它了!!\
# 这也是为什么i需要逆序的原因了
return lists
a = get_andomNumber(6)
print("排序之前:%s" %a)
b = heap_sort(a)
print("排序之后:%s" %b)