算法导论第6章
MAX_HEAPIFY()
HEAP_INCREASE_KEY()
HEAP_EXTRACT_MAX()
HEAPSORT()
BULID_MAX_HEAP()
#include<iostream>
#include<stdlib.h>
using namespace std;
int RIGHT (int i)
{
if(i<0)
{
cerr<<"error number"<<endl;
exit(1);
}
return 2*i+1;
}
int LEFT (int i)
{
if(i<0)
{
cerr<<"error number"<<endl;
exit(1);
}
return 2*i;
}
int PARENT (int i)
{
if(i<0)
{
cerr<<"error number"<<endl;
exit(1);
}
return i/2;
}
class max_heap
{
private:
int heap_size;
int* heap;
int length;
public:
max_heap(int size=10)
{
cout<<"enter "<<"number:"<<endl;
heap_size=size;
heap=new int[size];
int i=0,x;
while(cin>>x) heap[i++]=x;
length=i;
}
void show()
{
for(int i=0;i<length;i++) cout<<heap[i]<<" ";
cout<<endl;
}
void MAX_HEAPIFY(int i)
{
int largest;
int l=LEFT(i);
int r=RIGHT(i);
if(l<=length&&heap[l-1]>heap[i-1])
largest=l;
else
largest=i;
if(r<=length&&heap[r-1]>heap[largest-1])
largest=r;
if(largest!=i)
{
int a=heap[i-1];
heap[i-1]=heap[largest-1];
heap[largest-1]=a;
MAX_HEAPIFY(largest);
}
}
void BULID_MAX_HEAP()
{
for(int i=length/2;i>=1;i--)
MAX_HEAPIFY(i);
}
void HEAPSORT()
{
BULID_MAX_HEAP();
int len=length;
for(int i=length;i>=2;i--)
{
int a=heap[0];
heap[0]=heap[length-1];
heap[length-1]=a;
length--;
MAX_HEAPIFY(1);
}
length=len;
}
int MAXIMUM()
{
return heap[0];
}
bool HEAP_EXTRACT_MAX()
{
int MAX=MAXIMUM();
heap[0]=heap[length-1];
length--;
MAX_HEAPIFY(1);
return true;
}
bool HEAP_INCREASE_KEY(int x, int k)
{
if(k<heap[x-1]) return false;
heap[x-1]=k;
while(k>heap[PARENT(x)-1]&&x>=0)
{
int p=heap[x-1];
heap[x-1]=heap[PARENT(x)-1];
heap[PARENT(x)-1]=p;
x=PARENT(x)-1;
}
return true;
}
void INSERT( int x)
{
int i= -65535;
heap[length]=i;
length++;
HEAP_INCREASE_KEY(length,x);
}
};
int main()
{
int size=10;
max_heap maxhp(size);
cout<<"原始输入数组"<<endl;
maxhp.show();
maxhp.BULID_MAX_HEAP();
cout<<"最大堆数组"<<endl;
maxhp.show();
maxhp.HEAP_EXTRACT_MAX();
cout<<"删除最大元素后的数组"<<endl;
maxhp.show();
cout<<"修改key值后的数组"<<endl;
maxhp.HEAP_INCREASE_KEY(3,999);
maxhp.show();
cout<<"插入元素后的数组"<<endl;
maxhp.INSERT(888);
maxhp.show();
}