一般都用数组来表示堆,i结点的父结点下标就为(i – 1) / 2。它的左右子结点下标分别为2 * i + 1和2 * i + 2。如第0个结点左右子结点下标分别为1和2。
堆的操作——插入删除
下面先给出《数据结构C++语言描述》中最小堆的建立插入删除的图解,再给出本人的实现代码,最好是先看明白图后再去看代码。《数据结构 C++ 语言描述》(Data Structures C++ ) PDF 下载地址:http://www.linuxidc.com/Linux/2014-09/107319.htm
堆的插入
每次插入都是将新数据放在数组最后。可以发现从这个新数据的父结点到根结点必然为一个有序的数列,现在的任务是将这个新数据插入到这个有序数据中——这就类似于直接插入排序中将一个数据并入到有序区间中,对照《直接插入排序的三种实现》不难写出插入一个新数据时堆的调整代码:// 新加入i结点 其父结点为(i - 1) / 2void MinHeapFixup(int a[], int i){ int j, temp; temp = a[i]; j = (i - 1) / 2; //父结点 while (j >= 0) { if (a[j] <= temp) break; a[i] = a[j]; //把较大的子结点往下移动,替换它的子结点 i = j; j = (i - 1) / 2; } a[i] = temp;}更简短的表达为:void MinHeapFixup(int a[], int i){ for (int j = (i - 1) / 2; j >= 0 && a[i] > a[j]; i = j, j = (i - 1) / 2) Swap(a[i], a[j]);}插入时://在最小堆中加入新的数据nNumvoid MinHeapAddNumber(int a[], int n, int nNum){ a[n] = nNum; MinHeapFixup(a, n);}更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2014-09/107318p2.htm