Вы находитесь на странице: 1из 5

#include<iostream.h> #include<stdlib.h> #include<stdio.h> #include<conio.

h> #define maxSize 1024 class Deap { public: int n, deap[maxSize]; Deap() { n=1; } int MinMaxHeap(int); int MaxPartner(int); int MinPartner(int); void MinInsert(int, int); void MaxInsert(int, int); int DeleteMax(); int DeleteMin(); void Insert(int x); void Print(); void height_deap(); }; int Deap::MinMaxHeap(int i) { while(i>3) i/=2; if(i==2) return 0; return 1; } //Finding MaxPartner int Deap::MaxPartner(int pos) { int offset =1, i =pos; while(i>3) { i/=2; offset*=2; } if((pos+offset) >n) return (pos+offset)/2; return pos+offset; } //Finding minPartner int Deap::MinPartner(int pos) { int offset =1, i =pos; while(i>3) { i/=2; offset*=2; } return pos-offset;

} //Min Insertion void Deap::MinInsert(int at, int key) { for(int parent; (parent=at/2)!=1 && key<deap[parent];deap[at]=deap[parent], at=p arent); deap[at]=key; } //Max Insertion void Deap::MaxInsert(int at, int key) { for(int parent; (parent=at/2)!=1 && key>deap[parent]; deap[at]=deap[parent], at= parent); deap[at]=key; } //Max Deletion int Deap::DeleteMax() { int i, j, key, x=deap[n--]; if(n>=3) key=deap[3]; else { n--; return deap[2]; } for(i=3; 2*i<=n; deap[i]=deap[j], i=j) { j=i*2; if(j+1<=n) { if(deap[j]<deap[j+1]) j++; } } j=MinPartner(i); int biggest =j; if(2*j <=n) { biggest = 2*j; if(((2*j+1)<=n) && (deap[2*j]<deap[2*j+1])) biggest++; } if(x<deap[biggest]) { deap[i]=deap[biggest]; MinInsert(biggest, x); } else { MaxInsert(i, x); }

return key; } //min Deletion int Deap::DeleteMin() { int i, j, key=deap[2], x=deap[n--]; for(i=2; 2*i<=n;deap[i]=deap[j], i=j) { j=i*2; if(j+1<=n && deap[j] > deap[j+1]) j++; } j=MaxPartner(i); if(x>deap[j]) { deap[i]=deap[j]; MaxInsert(j,x); } else MinInsert(i,x); return key; } //Insertion void Deap::Insert(int x) { n++; if(n==sizeof(deap)) { cout<<"Heap Full\n"; exit(1); } if(n==2) { deap[2]=x; return; } if(MinMaxHeap(n)) { int i=MinPartner(n); if(x<deap[i]) { deap[n]=deap[i]; MinInsert(i,x); } else MaxInsert(n,x); } else { int i=MaxPartner(n); if(x>deap[i]) { deap[n]=deap[i]; MaxInsert(i,x); } else

MinInsert(n,x); } } //Print void Deap::Print() { int levelNum=2, thisLevel=0, gap=8; for(int i=2; i<=n; i++) { for(int j=0; j<gap-1; j++) cout<<" "; if(thisLevel != 0) { for(int j=0; j<gap-1; j++) cout<<" "; } if(deap[i]==1) cout<<" "; cout<<deap[i]; thisLevel++; if(thisLevel == levelNum) { cout<<"\n"; thisLevel = 0; levelNum *=2; gap/=2; } } cout<<"\n"; if(thisLevel !=0) cout<<"\n"; } void Deap::height_deap() { int i=n,level=0; while(i>=1) { level++; i=i/2; } cout<<"\nHeight of the deap:\t"<<level-1<<"\n"; } void main() { Deap a; int data[20],ch, newElement, numElement,key; clrscr(); while(1) { cout<<"\t * * * Implementation of Deaps * * * \n"; cout<<"\n1.Insert\n2.DeleteMin\n3.DeleteMax\n4.Height\n"; cout<<"\n5.Exit\n Enter your choice : "; cin>>ch; switch(ch) { case 1: cout<<"Enter the new element:\n"; cin>>newElement; a.Insert(newElement); a.Print(); break;

case 2: key=a.DeleteMin(); cout<<"The Minimum Element is Deleted:\t"<<key<<"\n"; a.Print(); break; case 3: key=a.DeleteMax(); cout<<"The Maximum Element is Deleted:\t"<<key<<"\n"; a.Print(); break; case 4: a.height_deap(); break; case 5: exit(0); } }}

Вам также может понравиться