堆排序

# 堆排序的向下调整性
# 排序步骤:建堆 交换堆顶元素和最后一个元素 调整使堆重新有序 i的指向前移(i指向最后一个元素)重复2以后的步骤
# 交换步骤将堆中的最大元素移动到了堆的最后位置,排序完成后,得到的是一个升序序列
# 大根堆的排序
# 向下调整
def sift(li,low,high):
	"""
	:param li:调整的列表
	:param low:调整的堆的堆顶元素的位置
	:param high:调整的堆的最后一个叶子节点的位置
	:return 
	"""
	i = low
	j = 2 * i + 1
	tmp = li[i]
	while j<=high:
		# 判断左右两节点,哪个更大,大的为j
		j = j+1 if j<high and li[j+1]>li[j] else j
		# 判断i和j哪个大,大的放到i的位置,i指向当前j的位置,j指向新的i的下一层
		if tmp<li[j]:
			li[i] = li[j]
			i = j
			j = 2 * i + 1
		else:
			break
	li[i] = tmp

def heap_sort(li):
	# 建立堆
	for i in range(len(li)//2-1,-1,-1):
		sift(li,i,len(li)-1)
	# 排序
	for i in range(len(li)-1,-1,-1):
		li[0],li[i] = li[i],li[0]
		sift(li,0,i-1)

# 测试
import random
li = []
for i in range(1,100):
	li.append(i)
random.shuffle(li)
print("堆排序前:")
print(li)
heap_sort(li)
print("堆排序后:")
print(li)

  

堆排序思路可参见:

 https://www.cnblogs.com/chengxiao/p/6129630.html

原文地址:https://www.cnblogs.com/shannen/p/12947003.html