Advertisement
Cyzol

kopiec

Nov 21st, 2019
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.68 KB | None | 0 0
  1. // Lab06KopiecBinarny.cpp : Ten plik zawiera funkcję „main”. W nim rozpoczyna się i kończy wykonywanie programu.
  2. //
  3.  
  4. #include <iostream>
  5. #include <random>
  6.  
  7. using namespace std;
  8.  
  9. struct Kopiec
  10. {
  11. public:
  12.     int* dane;
  13.     int rozmiar_max;
  14.     int rozmiar;
  15.  
  16.     Kopiec()
  17.     {
  18.         rozmiar = 0;
  19.         rozmiar_max = 1;
  20.         dane = new int[rozmiar_max];
  21.     }
  22.  
  23.     void Dodaj(int key);
  24.     void Kopcowanie(int key);
  25.     void zamien(int* x, int* y);
  26.     int rodzic(int indeks);
  27.     int l_dziecko(int indeks);
  28.     int p_dziecko(int indeks);
  29.     void Kopcowanie_dol(int i);
  30.     void usun();
  31. };
  32.  
  33. void Kopiec::Dodaj(int key)
  34. {
  35.     if (rozmiar < rozmiar_max)
  36.     {
  37.         dane[rozmiar] = key;
  38.         rozmiar += 1;
  39.     }
  40.     else
  41.     {
  42.         rozmiar_max = rozmiar_max + 1;
  43.         int* tab = new int[rozmiar_max];
  44.         for (int i = 0; i < rozmiar_max; i++)
  45.         {
  46.             tab[i] = dane[i];
  47.         }
  48.         tab[rozmiar] = key;
  49.         rozmiar += 1;
  50.         delete[] dane;
  51.         dane = tab;
  52.     }
  53.  
  54.     Kopcowanie(key);
  55. }
  56.  
  57. void Kopiec::Kopcowanie(int key)
  58. {
  59.     int i = rozmiar - 1;
  60.     dane[i] = key;
  61.  
  62.     while( i != 0 && dane[rodzic(i)] < dane[i])
  63.     {
  64.         zamien(&dane[i], &dane[rodzic(i)]);
  65.         i = rodzic(i);
  66.     }
  67.  
  68. }
  69.  
  70. void Kopiec::zamien(int* x, int* y)
  71. {
  72.     int temp = *x;
  73.     *x = *y;
  74.     *y = temp;
  75.  
  76. }
  77.  
  78.  
  79. void Kopiec::Kopcowanie_dol(int i)
  80. {
  81.     int l = l_dziecko(i);
  82.     int r = p_dziecko(i);
  83.     int smallest = i;
  84.     if (l < rozmiar && dane[l] > dane[i])
  85.         smallest = l;
  86.     if (r < rozmiar && dane[r] > dane[smallest])
  87.         smallest = r;
  88.     if (smallest != i)
  89.     {
  90.         zamien(&dane[i], &dane[smallest]);
  91.         Kopcowanie_dol(smallest);
  92.     }
  93. }
  94.  
  95. void Kopiec::usun()
  96. {
  97.     int* tab = new int[rozmiar - 1];
  98.     zamien(&dane[0], &dane[rozmiar - 1]);
  99.     for (int i = 0; i < rozmiar - 1; i++)
  100.     {
  101.         tab[i] = dane[i];
  102.     }
  103.     delete[] dane;
  104.     dane = tab;
  105.     Kopcowanie_dol(0);
  106. }
  107.  
  108.  
  109. int Kopiec::rodzic(int indeks)
  110. {
  111.     return (indeks - 1) / 2;
  112. }
  113.  
  114. int Kopiec::l_dziecko(int indeks)
  115. {
  116.     return 2 * indeks + 1;
  117. }
  118.  
  119. int Kopiec::p_dziecko(int indeks)
  120. {
  121.     return 2 * indeks + 2;
  122. }
  123.  
  124.  
  125.  
  126.  
  127. int main()
  128. {
  129.     Kopiec* heap = new Kopiec;
  130.  
  131.     std::random_device rd;
  132.     std::default_random_engine generator(rd());
  133.     std::uniform_int_distribution<long long> zakres_losowania(0, 10000);
  134.  
  135.     for (int i = 0; i < 100; i++)
  136.         heap->Dodaj(zakres_losowania(generator));
  137.  
  138.     for (int i = 0; i < heap->rozmiar; i++)
  139.         cout << heap->dane[i] << endl;
  140.  
  141.     heap->usun();
  142.     cout << endl;
  143.     for (int i = 0; i < heap->rozmiar-1; i++)
  144.         cout << heap->dane[i] << endl;
  145. }
  146.  
  147.  
  148.  
  149.  
  150.  
  151.  
  152.  
  153. //int Kopiec::znajdz_najwiekszy()
  154. //{
  155. //  if (rozmiar <= 0)
  156. //      return INT_MAX;
  157. //  if (rozmiar == 1)
  158. //  {
  159. //      rozmiar--;
  160. //      return dane[0];
  161. //  }
  162. //
  163. //  int root = dane[0];
  164. //  dane[0] = dane[rozmiar - 1];
  165. //  rozmiar--;
  166. //  Kopcowanie_dol(0);
  167. //
  168. //  return root;
  169. //}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement