一:原理
要理解堆排序,首先要了解堆的知识。然后根据堆进行排序。
(1)堆:
堆是基于完全二叉树的原理。完全二叉树:一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。
由图解所示,每一个堆顶都满足大于它的左孩子和右孩子,此堆成为大顶堆。相反,每一个堆顶都满足小于它的左孩子和右孩子,此堆成为小顶堆。
小顶堆: 大顶堆:
堆中的数遵循从上到下,从左到右的顺序从开始对堆中的数进行编号。假设堆顶编号为i,则左子数列编号为 i*2 ,右子数列 i*2+1。
三:代码
#首先我们需要编写一个函数构造一个大顶堆 def maxHeapify(heap,start,end): son=start*2#定义son为左子序列 while son <= end : if son+1 <= end and heap[son+1] > heap[son]:'''选取左子树根和右子树根中比较大的编号缓存到son中''' son+=1#获取son的子数列的下标并缓存到son中 if heap[son] > heap[start]: heap[son],heap[start]=heap[start],heap[son]#交换大于父子序列的值,使之在堆顶的位置 start,son=son,son*2#迭代到下一个子序列迭代到下面的数列 else: break def HeapSort(a): heap=[None]+a#因为堆的编号下标为1,所以用[None]来当做占位符,占位数组中下标为0的位置 root=1#代表堆顶元素的编号 l=len(heap) for i in range(l//2,root-1,-1):#自底向上地构造堆 maxHeapify(heap,i,l-1) for i in range(l-1,root,-1):#因为此时堆底元素为最小元素,将堆底元素和堆顶元素进行交换 heap[i],heap[root]=heap[root],heap[i] maxHeapify(heap,root,i-1)#交换后保持堆的合法性 return heap[root:] 执行: a=[1,8,2,6,7,3,4,9,5] print(HeapSort(a))
结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9]