算法导论之堆排序
最大堆:所有根节点的值都比子节点的值大
最小堆:所有根节点的值都比子节点的值小
排序步骤:
将n个元素按顺序排列成完全树,建立最大堆(或最小堆),最大堆排序结果为逆序,最小堆排序结果为顺序。每次取堆顶元素放入一个新数组,取完后将堆顶元素和最后一个元素交换,然后重新建立最大地(或最小堆),取n次,新数组即为有序数组。
python代码实现堆排序:
def maxHeapify(lList, nStart, nEnd): nDad = nStart nSon = nDad*2+1 while nSon<nEnd: if nSon+1<nEnd and lList[nSon+1]>lList[nSon]: nSon+=1 if lList[nSon]>lList[nDad]: lList[nSon], lList[nDad]=lList[nDad],lList[nSon] else: break nDad = nSon nSon=nDad*2+1 def HeapSort(lList): n=int(len(lList)/2-1) while n>=0: maxHeapify(lList,n,len(lList)) n-=1 n=len(lList)-1 #输出排序结果 每次输出第一位,并且将第一位与最后一个元素交换,然后重新排序一遍 while n>=0: print(lList[0],end="") lList[0]=lList[n] maxHeapify(lList,0,n) n-=1 print() def main(): l = [0,1,2,3,4,5,6,7,8,9] HeapSort(l) if __name__ == "__main__": main()