堆的标准模板

来源:互联网 发布:软件界面素材下载 编辑:程序博客网 时间:2024/05/18 03:36

向下搜索函数,对堆的有序性进行维护(重点)

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); //最后的叶子结点已经是最大的值,对前面的结点调整;
 }
}




1 0
原创粉丝点击