Advertisement
darkjessy94

Coda_di_priorità_Min-Heap

Feb 18th, 2018
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.42 KB | None | 0 0
  1. #include "Coda_di_priorita.h"
  2.  
  3.  
  4. Coda_di_priorita::Coda_di_priorita()
  5. {
  6.     string nome;
  7.     int input;
  8.     cout<<"Dimmi quanti elementi vuoi inserire: ";
  9.     cin>>n_oggetti;
  10.  
  11.     ogg=new Oggetto[n_oggetti];
  12.  
  13.         for(int i=0;i<n_oggetti;i++)
  14.         {
  15.             cout<<"Inserire nome oggetto: ";
  16.             cin>>nome;
  17.             (ogg+i)->set_nome(nome);
  18.             cout<<"Inserire peso oggetto: ";
  19.             cin>>input;
  20.             (ogg+i)->set_peso(input);
  21.             cout<<"Inserire valore oggetto: ";
  22.             cin>>input;
  23.             (ogg+i)->set_valore(input);
  24.             (ogg+i)->set_priorita();
  25.         }
  26. }
  27.  
  28. Coda_di_priorita::Coda_di_priorita(Oggetto *ogg,int n_oggetti)
  29. {
  30.     this->ogg=ogg;
  31.     this->n_oggetti=n_oggetti;
  32. }
  33.  
  34. Coda_di_priorita::~Coda_di_priorita()
  35. {
  36.     delete []ogg;
  37. }
  38.  
  39. void Coda_di_priorita::HeapSort()
  40. {
  41.     Build_Min_Heap();
  42.     for(int j=n_oggetti-1;j>0;j--)
  43.         {
  44.             swap(*(ogg+0),*(ogg+j));
  45.             heap_size--;
  46.             Heapify(0);
  47.         }
  48. }
  49.  
  50. void Coda_di_priorita::Build_Min_Heap()
  51. {
  52.     heap_size = n_oggetti;
  53.     for (int i=n_oggetti/2; i>=0; i--)
  54.         Heapify(i);
  55. }
  56.  
  57. void Coda_di_priorita::Heapify(int i)
  58. {
  59.     int l,r,minimo;
  60.     l=Left(i);
  61.     r=Right(i);
  62.  
  63.     if(l < heap_size && ((ogg+l)->get_priorita() < (ogg+i)->get_priorita()))
  64.         minimo = l;
  65.     else
  66.         minimo = i;
  67.  
  68.     if( r < heap_size && ((ogg+r)->get_priorita() < (ogg+minimo)->get_priorita()))
  69.         minimo = r;
  70.  
  71.     if(minimo!=i)
  72.     {
  73.         swap(*(ogg+i),*(ogg+minimo));
  74.         Heapify(minimo);
  75.     }
  76. }
  77.  
  78. void Coda_di_priorita::Heap_Decrease_priority(int i,int val)
  79. {
  80.     if(val>((ogg+i)->get_valore()))
  81.         cout<<"Errore. Il nuovo valore e' maggiore dell'attuale"<<endl;
  82.     else
  83.         {
  84.             (ogg+i)->set_valore(val);
  85.             (ogg+i)->set_priorita();
  86.  
  87.             while(i>0 && (ogg+Padre(i))->get_valore() > (ogg+i)->get_valore())
  88.                 {
  89.                     swap(*(ogg+i),*(ogg+Padre(i)));
  90.                     i=Padre(i);
  91.                 }
  92.         }
  93. }
  94.  
  95. Oggetto Coda_di_priorita::Heap_Minimum()
  96. {
  97.     return *(ogg);
  98. }
  99.  
  100. Oggetto Coda_di_priorita::Heap_Extract_Min()
  101. {
  102.     if(heap_size<=0)
  103.         {cout<<"Errore."<<endl;exit(1);}
  104.     Oggetto minimo;
  105.     minimo=*(ogg);
  106.     swap(*(ogg+0),*(ogg+heap_size-1));
  107.     heap_size=heap_size-1;
  108.     resize_oggetti(heap_size);
  109.     Heapify(0);
  110.     return minimo;
  111. }
  112.  
  113. void Coda_di_priorita::Insert(Oggetto x)
  114. {
  115.     n_oggetti=n_oggetti+1;
  116.     resize_oggetti(n_oggetti);
  117.     *(ogg+n_oggetti-1)=x;
  118. }
  119.  
  120. void Coda_di_priorita::resize_oggetti(int newsize)
  121. {
  122.     Oggetto* newArr = new Oggetto[newsize];
  123.  
  124.     if(newsize>n_oggetti)
  125.     {
  126.         for(int i=0;i<n_oggetti;i++)
  127.             *(newArr+i)=*(ogg+i);
  128.     }
  129.     else
  130.     {
  131.         for(int i=0;i<newsize;i++)
  132.             *(newArr+i)=*(ogg+i);
  133.     }
  134.     delete [] ogg;
  135.     ogg = newArr;
  136.     n_oggetti=newsize;
  137. }
  138.  
  139. int Coda_di_priorita::Left(int i) { return 2*i+1;}
  140. int Coda_di_priorita::Right(int i) { return 2*i+2;}
  141. int Coda_di_priorita::Padre(int i) {return i/2;}
  142.  
  143.  
  144. void Coda_di_priorita::stampa()
  145. {
  146.         for(int i=0;i<n_oggetti;i++)
  147.         {
  148.             cout<<i+1<<") "<<(ogg+i)->get_nome()<<"\t";
  149.             cout<<"Peso: "<<(ogg+i)->get_peso()<<"\t";
  150.             cout<<"Valore: "<<(ogg+i)->get_valore()<<"\t";
  151.             cout<<"Priorita': "<<(ogg+i)->get_priorita()<<endl;
  152.         }
  153. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement