#include <iostream>
#define Max 10
using namespace std;
int n;
int a[Max]={7,20,25,13,30,5,7,8};
void adjust_heap(int* a,int s,int m){
int as=a[s];
for(int j=2*s;j<=m;j*=2){
if(j<m&&a[j]>a[j+1]) j++;//先比较左右孩子谁小些
if(as<a[j]) break; //父节点仍是最小就跳出,否则交换父子的位置
a[s]=a[j];//孩子比父亲要小,往上走
s=j;//s要往下走,因为有了这步的控制,会使m>j,从而跳出for的循环,也是不断往下调整的过程
a[j]=as;
}
}
//建堆,不断调用调整堆的过程
void create_heap(int* a){
int i,n;
// cout<<"请输入要创建的个数\n";
//cin>>n;
n=7;
// a[0]=n;//用数组的第一个存储位置存放堆数据的长度
// cout<<"请输入数字:\n";
// for(i=1;i<=n;i++)
// cin>>a[i];
cout<<"当前的堆为:"<<" ";
for(i=1;i<=n;i++)
cout<<a[i]<<" ";
cout<<endl;
//对其进行调整
for(i=n/2;i>0;i--)
adjust_heap(a,i,n);//用a[0]/2自己及之前的元素进行建堆
cout<<"调整后的的堆为:"<<" ";
for(i=1;i<=n;i++)
cout<<a[i]<<" ";
}
int deleteMax(int *a) {
int t;
t = a[1];
a[1] = a[n];
n--; //堆的元素减少1
// shiftdown(1); //向下调整
int x=a[1];
int i=1;
while(i<=n){
if(x>a[2*i]){
a[i]=a[2*i];
i=2*i;
continue;
}
if(x>a[2*i+1]){
a[i]=a[2*i+1];
i=2*i+1;
continue;
}
a[i]=x;
break;
}
return t;
}
void MaxHeapInsert(int *a, int x)
{
// if(H.HeapSize==H.MaxSize) return false;
//
// int i=++H.HeapSize;
// while(i!=1&&x>H.heap[i/2])
// {
// H.heap[i]=H.heap[i/2];
// i/=2;
// }
// H.heap[i]=x;
int i=(n+1);
while(i!=1&&x<a[i/2]){
a[i]=a[i/2];
i/=2;
}
a[i]=x;
n++;
//return true;
}
int main(){
//a[Max]=
n=7;
create_heap(a);
int t= deleteMax(a);
cout<<endl;
cout<<"delete:";
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
MaxHeapInsert(a,3);
cout<<endl;
cout<<"Insert:";
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
return 0;
}
最小堆的创建,删除,增加
最新推荐文章于 2021-12-08 12:36:08 发布