向下搜索函数,对堆的有序性进行维护(重点)
void downsearch(int low,int high)
{
int i=low; // i的意思是现在的节点位置(用的数组存储二叉树)
int j=low*2; //子结点
while(j<=high) //在high范围内
{
if(heap[j]<heap[j+1]&&j+1<=high)
{
j=j+1; //左右孩子寻找最大的一个(大根堆,大的向上走)
}
if(heap(j)>heap(i))
{
swap(heap(j),heap(i)); //交换值
i=j; //更新现在处理的节点
j=i*2;
} else break; //孩子权值比要调整的结点小,完成调整
}
}
void creat() //对一个数组进行堆的调整
{
for(int i=n/2;i>=1;i--) //倒序是为了保证每一次的最上方的结点为最大
{
downsearch(i,n);
}
}
void del() //删除根结点
{
heap[1]=heap[n]; //根结点赋值为叶子结点
n=n-1;
downsearch(1,n); //堆的维护
}
void add(int low,int high) //加入结点
{
int i=high; //从下往上维护
int j=high/2; //父亲结点
while(j>=low)
{
if(heap[i]>heap[j])
{
swap(heap[i],heap[j])
i=j; //更新结点位置
j=i/2;
}
else break; //调整完毕
}
}
void sort() //实现堆排序的函数
{
for(int i=n;i>1;i--) //因为是大根堆,所以根结点一定最大,据此调整
{
swap(1,n);
down(1,i-1); //最后的叶子结点已经是最大的值,对前面的结点调整;
}
}