//插入后调整
void Maxheap_In(int start){//start是插入点位置一般为最后一个空元素位置
int c=start;//current当前节点位置
int p=(c-1)/2;//父节点位置
int temp=arr[c];//记录当前位置数据
while(c>=0&&temp<arr[p]){
arr[c]=arr[p];
c=p;
p=(p-1)/2;
}
arr[c]=temp;
}
int Maxheap_Insert(int data,int m_size){
//m_size为最后一个空元素
if(m_size==m_capacity){
return -1;
}
arr[m_size]=data;
Maxheap_In(m_size);
++m_size;
return m_size;
}
//获取目标数据下标
int get_index(int data){
for(int i=0;i<m_size;++i){
if(data==arr[i]){
return i;
}
}
return -1;
}
//删除后调整
void Maxheap_Out(int start,int end){
//end为最后一个元素(非空)
int c=start;
int l=2*c+1;//左孩子的位置
int temp=arr[c];
while(l<=end){//l为左孩子l+1为右孩子
if(l<end&&arr[l]<arr[l+1]){
//增加l<end防止只有左孩子没有右孩子
++l;//将l转变为最大的孩子
}
if(temp>arr[l]){
break;
}
else{
arr[c]=arr[l];
c=l;
l=2*l+1;
}
}
arr[c]=temp;
}
int Maxheap_Erase(int data){
int index;
if(m_size==0){
return -1;
}
index=get_index(data);
if(index==-1){
return -1;
}
arr[index]=arr[end];
Maxheap_Out(inedx,end-1);
//因为end元素已经被用来填补.所以end-1为最后一个非空元素
--m_size;
}
最大堆操作
最新推荐文章于 2021-12-01 18:54:14 发布