堆排序
堆是一种特殊的完全二叉树(除了最后一层节点之外,其它层的节点必须是最大值),然后最后一层的节点必须集中在最左侧。
创建堆把 n 个元素建立成一个堆,首先我可以将这 n 个节点以自顶向下,从左到右的方式从 1 到 n 编码。这样就可以把这 n 个节点转换成为一棵完全二叉树,紧接着从最后一个非叶节点(节点编号为 n/2)开始到根节点(节点编号为1)逐个扫描所有节点,根据需要将当前节点向下调整,直到以当前节点为根节点的子树符合堆的特性:
1234// 从最后一个非叶结点到第1个结点依次进行向下调整for(i=n/2;i>=1;i--){ siftdown(i);}
最大堆所有父节点都比子节点要大:
12345678910111213141516171819202122232425262728
...