#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;
}
最小优先队列--堆实现
最新推荐文章于 2024-05-10 16:46:34 发布