创建最大堆

首先来观察一颗最大堆二叉树 和一个普通序列的映射情况:在序列中从length(LIST)/2+1 -> length(LIST)的元素都对应于二叉树的叶子节点,同时也是一颗独立的树,且最大数就是自己本身。




#include<iostream>

#define LEFT(i)  (i<<2)
#define RIGHT(i)  ((i<<2)+1)

using namespace std;
void swap(int& small, int& big)
{
     int temp = small;
     small = big;
     big = temp;
}

void heap_adjust(int arr[], int root, int size)
{
	int leftchild = LEFT(root);
	int rightchild = RIGHT(root);
	int largest;

	if ( leftchild <= size && arr[leftchild] > arr[root])
		largest = leftchild;
	else
		largest = root;

	if ( rightchild <= size && arr[rightchild] > arr[root])
		largest = rightchild ;

	/*
	| 上面已经把父节点arr[root]和左右儿子节点做大小比较(arr[leftchild],arr[rightchild])
	| 当arr[leftchild]或arr[rightchild]大于父节点时,就交换他们的位置,
	| 此时这棵树就是最大堆
	|
	|但还要确保以孩子节点为根的子树也是最大二叉树堆,所以依次比较,也就是递归比较
	*/
	if ( largest != root )
	{
		swap (arr[root], arr[largest]);
		heap_adjust(arr, largest, size);
	}
}

/*
 |序列中从arr[size/2+1]开始一直到arr[size-1]
 |在映射到完全二叉树的过程中都为叶子节点,即都为一颗独立的二叉树
 |且都是只包含一个节点(即自己本身)的完全二叉树
 |
 |所以在建树的时候,从arr[size/2 : 0]反向建树,
 |这样可以确保在对构建完整的二叉树从上至下,从左至右,所遵循的次序
 |与序列中从0 -> (size-1)的循序是对应的。
*/
void build_heap(int arr[], int size)
{
     for (int i = size/2; i >= 0; i-- )
         heap_adjust(arr, i, size);
}

//创建最大堆
int main()
{
    const int size = 10;
    int iarray[size] = {15,3,4,9,25,60,87,88,92,5};
    build_heap(iarray,size-1);
    
    for (int i = 0; i < size; i++ )
    cout << iarray[i] << " ";
    
    cin.get();
    return 0;
}


































































































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值