icatalin

Laborator-5-Heap.txt

Jan 5th, 2019
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.03 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. void swap(int &a, int &b)
  6. {
  7.     int aux = a;
  8.     a = b;
  9.     b = aux;
  10. }
  11. class Heap
  12. {
  13.     int v[100];
  14.     int n ; //numarul de noduri
  15.     void pushUp(int k);
  16.     void pushDown(int k);
  17. public:
  18.     Heap()
  19.     {
  20.         n = 0;
  21.     };
  22.     Heap(int v2[], int n2); //construieste un heap pe baza vectorului v2
  23.     void insert(int); //adauga la final un element nou si ii face push up
  24.     int delHead(); //returneaza si radacina dupa ce o sterge
  25.     void sort(); //heapSort
  26.     void print();
  27. };
  28.  
  29. void Heap::pushUp(int k)
  30. {
  31.     while( k != 1 && v[k] > v[k/2]) //cat timp fiul este mai mare decat parintele, le interschimba
  32.     {
  33.         swap(v[k], v[k/2]);
  34.         k = k/2;
  35.     }
  36. }
  37.  
  38. void Heap::insert(int val)
  39. {
  40.     n++;
  41.     v[n] = val;
  42.     pushUp(n);
  43. }
  44.  
  45. void Heap::print()
  46. {
  47.     for(int i = 1; i <= n; i++)
  48.         cout << v[i] << " ";
  49.     cout<<endl;
  50. }
  51.  
  52. void Heap::pushDown(int k)
  53. {
  54.     int maxim = k;
  55.     if(v[maxim] < v[2*k] && 2*k <= n) //compar cu fiul stang
  56.         maxim = 2*k;
  57.     if(v[2*k+1] > v[maxim] && 2*k+1 <= n) //compar cu fiul drept
  58.         maxim = 2*k+1;
  59.     if(maxim != k)
  60.     {
  61.         swap(v[k], v[maxim]); //interschimb cu maximul dintre fii
  62.         pushDown(maxim);
  63.     }
  64. }
  65.  
  66. Heap::Heap(int v2[], int n2)
  67. {
  68.     for(int i = 1; i <= n2; i++)
  69.         v[i] = v2[i];
  70.     for(int i = n/2; i >= 1; i++) //de la primul nod care nu e frunza, apelez pushDown
  71.         pushDown(i);
  72. }
  73.  
  74. int Heap::delHead()
  75. {
  76.     swap(v[1], v[n]);
  77.     n--;
  78.     pushDown(1);
  79.     return v[n+1];
  80. }
  81.  
  82. void Heap::sort()
  83. {
  84.     int nAux = n;
  85.     for(int i = 1; i<= nAux; i++)
  86.         delHead();
  87.     n = nAux;
  88. }
  89.  
  90. int main()
  91. {
  92.  
  93.     Heap h;
  94.     h.insert(3);
  95.     h.insert(4);
  96.     h.insert(11);
  97.     h.insert(2);
  98.     h.insert(5);
  99.     h.insert(9);
  100.     h.print();
  101.     h.sort();
  102.     h.print();
  103.  
  104.  
  105.     int v2[100], n2;
  106.     cout<<"n2 = ";
  107.     cin>>n2;
  108.     for(int i = 1; i<= n2; i++)
  109.         cin>>v2[i];
  110.     Heap h2(v2, n2);
  111.     h2.print();
  112.  
  113.  
  114.     return 0;
  115. }
Add Comment
Please, Sign In to add comment