最小优先队列--堆实现

#include<iostream>
using namespace std;
int INF = 10000;

//交换变量的值
void swap(int* a,int* b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

//建立以i为根的最小堆
void Min_Heapify(int* A,int i,int heapsize)
{
	int l = 2*i;
	int r = 2*i+1;
	int smallest;
	if(l <= heapsize && A[l] < A[i])
	{
		smallest = l;
	}
	else
	{
		smallest = i;
	}
	if(r <= heapsize && A[r] < A[smallest])
	{
		smallest = r;
	}
	if(smallest != i)
	{
		swap(&A[smallest],&A[i]);
		Min_Heapify(A,smallest,heapsize);//维护修改后堆的结构
	}
}

//建立初始堆
void Build_Min_Heap(int* A,int heapsize)
{
	for(int i = heapsize/2; i >= 1;i--)
	{
		Min_Heapify(A,i,heapsize);
	}
}

//返回最小值
int Heap_Mininum(int* A)
{
	return A[1];
}

//取最小值,并删除
int Heap_Extract_Min(int* A,int& heapsize)
{
	if(heapsize < 1)
		cout<<"heap underflow!"<<endl;
	int min = A[1];
	A[1] = A[heapsize];
	heapsize--;
	Min_Heapify(A,1,heapsize);
	return min;
}

//将i节点的值减小到某一值key
void Heap_Decrease_Key(int* A,int i,int key)
{
	if(key > A[i])
		cout<<"new key is bigger than current key!"<<endl;
	A[i] = key;
	while(i > 1 && A[i] < A[i/2])
	{
		swap(&A[i],&A[i/2]);
		i /= 2;
	}
}

//插入元素
void Heap_Insert(int* A,int key,int& heapsize)
{
	heapsize++;
	A[heapsize] = INF;
	Heap_Decrease_Key(A,heapsize,key);
}

//打印数组
void PrintArray(int* A,int heapsize)
{
	for(int i = 1;i <= heapsize;i++)
	{
		cout<<A[i]<<"  ";
	}
	cout<<endl;
}

int main()
{
	int A[100];
	int heapsize;
	cout<<"请输入数组元素个数:";
	cin>>heapsize;
	for(int i = 1;i <= heapsize;i++)//数组下标从1开始
	{
		cout<<"输入A["<<i<<"]:";
		cin>>A[i];
	}
	cout<<endl;
	Build_Min_Heap(A,heapsize);
	cout<<"建堆后数组:"<<endl;
	PrintArray(A,heapsize);
	cout<<endl;
	int min = Heap_Mininum(A);
	cout<<"最小值:"<<min<<endl;
	cout<<"将某一元素减小到某一值之后的数组:"<<endl;
	Heap_Decrease_Key(A,3,1);
	PrintArray(A,heapsize);
	cout<<endl;
	Heap_Extract_Min(A,heapsize);
	cout<<"删除最小值之后的数组:"<<endl;
	PrintArray(A,heapsize);
	cout<<"增加某一元素:";
	int key;
	cin>>key;
	cout<<endl;
	Heap_Insert(A,key,heapsize);
	cout<<"增加元素后的数组:"<<endl;
	PrintArray(A,heapsize);
	cout<<endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值