一、堆的定义
n[i]<=n[2i] && n[i]<=n[2i+1]。其实堆的概念就是完全二叉树了。i结点的左孩子结点是2i,右孩子是2i+1。
二、解决堆所面临的两个问题
1、//问题一:无序序列建立一个堆
void HeapSort(){
//建成了堆
for (int i = length/2; i > 0; --i)
{
//从非终端结点开始筛选
HeapAdjust(i,length);
}
for (int i = length; i>1; --i)
{
//输出堆顶元素 然后进行筛选
Swap(1,i);
//对剩下的进行筛选
HeapAdjust(1,i-1);
}
}
2、/问题二:如何在输出堆顶元素之后,调整剩余元素成为一个新的堆
void HeapAdjust(int s,int m){
int rc = sqTable[s];
for (int j= 2*s ; j <= m; j*=2)
{
if (j<m&& sqTable[j]<sqTable[j+1])
{
j++;//j为儿子中较大的下标
}
if (rc < sqTable[j])
{
break;
}
//往下移动一格
sqTable[s] = sqTable[j];
s = j;
}
sqTable[s] = rc;
}