要弄清楚堆排序,我们首先要懂得以下两点:
1)逻辑上的结构,怎么样才是一个堆。
2)存储上的结构,一个堆存储起来的结构是怎么样的。
一般来讲,堆排序中的“堆”指的是二叉堆,一种完全二叉树的结构,每个父结点最多只有两个子结点,且满足两点:
1)父结点总是大于(小于)其两个子结点(大于的,我们叫最大堆,小于的,我们叫最小堆)。
2)父结点的左右子树也都满足上面1)的规则,也就是说其左右子树也是一个最大堆或者是最小堆。
树结构,我们可以看下图:
一般来说,算法中提到的堆结构都是用数组来存储的,所以上面的这个二叉树放在数组中就是
从上面我们可以看到,按顺序从上到下,从左到右存储,比如“1”存在a[0],则其左子结点则存在a[2*0 + 1]=a[1]的位置上,其右子结点则存在a[2*0 + 2] = a[2]的位置上,而"2"的左结点是4,是存在a[2*1+1] = a[3]的位置上,其右结点5,则是在跟着的位置上,所以我们可以发现如果父结点的位置是i,则其左右子结点的位置分别2*i + 1 和 2*i + 2ÿ