基础知识
堆结构是完全二叉树的结构,即从根节点到倒数最二层满足每个根节点都有两个子节点,最后一层可以不完全填充,但是叶子节点必须靠左对齐。在程序中是用数组来表示一个堆,若根节点在数组中的下标为index,则满足以下关系:
左子节点的下标left = 2*index+1,右子节点下标right = 2*index+2;
若当前节点的下标为index,则其父节点的下标为(index-1)/2。
算法整体思路
堆排序(从小到大)主要分为两个部分,建立大根堆和堆调整。建立大根堆即保证堆顶元素为最大值,将堆顶元素(在数组中下标为0)与末尾元素(在数组中下标为len-1)交换,这样数组末尾的元素即为最大值。但此时受到交换的影响,堆顶元素不是最大值,再通过堆调整将剩下的元素调整为大根堆,再将其与数组倒数第二位元素交换。。。以此类推,直到整个数组有序。
建立大根堆步骤
1、对于堆中每个节点,将其与当前根节点比较,若比当前根节点大,则交换
2、将当前根节点作为当前节点,与上层根节点继续上述比较,直到与整个堆的根节点比完为止
3、以数组【2 1 4 0 8 10 3】为例,建立大根堆的步骤如下图: