# 堆排序的向下调整性 # 排序步骤:建堆 交换堆顶元素和最后一个元素 调整使堆重新有序 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)
堆排序思路可参见: