创建堆

<span style="white-space:pre">	</span>课题----创建优先队列
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>堆又称之为优先队列,其用途非常广泛,我们可以通过数组实现堆的存储。堆有一条很重要的性质,即堆中任一颗子树的根节点的值总是小于或等于其任一个儿子的节点值(前提是其存在儿子)。
	堆存在诸多操作,如建堆,删除根,插入节点,合并堆等。其中建立堆是最基础的操作,在此,通过c++实现堆的建立。

#include <iostream>
using namespace std;
#define LEN 15 // 数组长度,一般取可以填充满一颗满二叉树的长度值。如本程序中关键字个数为10,相应的满二叉树有15个节点,即数组长度应取15
#define N 10   // 关键字数目
int main(int argc, char *argv[])
{
	void buildHeap(int a[]);
	void percolateDown(int a[], int index);
	void printHeap(int a[]);

	int a[LEN] = {0,2,5,1,12,6,9,8,32,20,16,0,0,0}; // 建立数组,0号元素不存放实际元素并设置为0,其余位置设为0
	buildHeap(a);
	printHeap(a);

	return 0;
}


/**
	描述: 建堆
	a为存储堆元素的数组
*/
void buildHeap(int a[]){
	void percolateDown(int a[], int index);
	int k;
	for(k = N / 2; k > 0; k--){
		percolateDown(a, k);
	}
}


/**
	描述: 下虑节点
	k为待下虑的节点位置
*/
void percolateDown(int a[], int k){
	int temp = -1, tempValue = -1;
	while(k <= N && k*2 <= N) { 
		// 待下虑的节点位置
		if(a[k] > a[k * 2]) {
			temp = k * 2;
		} 
		if(k*2 + 1 <= N && a[k] > a[k*2 + 1]) {
			temp = a[k*2] > a[k*2 + 1] ? k*2 + 1 : k*2;
		}

		// 是否下虑
		if(temp != -1) {
			tempValue = a[temp];
			a[temp] = a[k];
			a[k] = tempValue;
			k = temp; // 下一个待下虑的节点位置
			temp = -1;
			continue;
		}
		break;		
	}
}


/**
	输出堆
*/
void printHeap(int a[]){
	int i;
	for(i = 0; i <= LEN - 1; i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值