Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Meno a priezvisko:
- POKYNY:
- (1) Subor premenujte na Priezvisko_Meno_ID_du05.cpp (pouzite vase udaje bez diakritiky).
- (2) Implementujte funkcie tak, aby splnali popis pri ich deklaraciach.
- (3) Cela implementacia musi byt v tomto jednom subore.
- (4) Odovzdajte len tento (spravne premenovany) zdrojovy subor.
- (5) Program musi byt kompilovatelny.
- (6) Globalne a staticke premenne su zakazane.
- (7) V ziadnom pripade nemente deklaracie funkcii, ktore mate za ulohu naprogramovat
- (nemente nazvy, navratove hodnoty ani typ a pocet parametrov v zadanych funkciach).
- Nemente implementacie zadanych datovych typov, ani implementacie hotovych pomocnych funkcii.
- (8) V pripade potreby mozete kod doplnit o dalsie pomocne funkcie alebo struktury.
- (9) Vase riesenie otestujte (vo funkcii 'main' a pomocou doplnenych pomocnych funkcii alebo struktur).
- Testovaci kod ale nebude hodnoteny.
- (10) Funkcia 'main' musi byt v zdrojovom kode posledna.
- */
- #include <iostream>
- using namespace std;
- //-------------------------------------------------------------------------------------------------
- // ULOHA (0.2 boda)
- //-------------------------------------------------------------------------------------------------
- /*
- Prida novy prvok do heapu.
- Verzia heap-u je Min-heap (hodnota kazdeho uzla je mensia alebo rovna ako hodnoty vsetkych jeho nasledovnikov).
- Pouzije algoritmus sift up.
- PARAMETRE:
- [in, out] data - heap, do ktoreho prida novy prvok
- [in] addIndex - index prvku, ktory prida do heap-u (preusporiadanim prvkov)
- VSTUPNE PODMIENKY:
- Prvky data[0]...data[addIndex-1] (vratane) tvoria heap
- 'data' ukazuje na platne pole
- 'addIndex' moze mat lubovolnu hodnotu
- VYSTUPNE PODMIENKY:
- Prvky data[0]...data[addIndex] (vratane) tvoria heap
- Preusporiada prvky data[0]...data[addIndex] tak, aby tvorili heap
- PRIKLADY:
- vstup: data = {2, 4, 10, 7, 1, 2, 5, 0, 3, -1, 11, 12, 1}, addIndex = 4
- vystup: data = {1, 2, 10, 7, 4, 2, 5, 0, 3, -1, 11, 12, 1}
- vstup: data = {3, 4, 10, 5, 5, 11, 15, 7, 8, 9, 10, 14, 8, 1, 2}, addIndex = 12
- vystup: data = {3, 4, 8, 5, 5, 10, 15, 7, 8, 9, 10, 14, 11, 1, 2}
- */
- void siftUp(int data[], const size_t addIndex)
- {
- // TODO
- }
- //-------------------------------------------------------------------------------------------------
- // ULOHA (0.2 boda)
- //-------------------------------------------------------------------------------------------------
- /*
- Vytvori heap na poli 'data' preusporiadanim prvkov.
- Verzia heap-u je Min-heap (hodnota kazdeho uzla je mensia alebo rovna ako hodnoty vsetkych jeho nasledovnikov).
- Pouzije algoritmus sift up.
- PARAMETRE:
- [in, out] data - pole, ktore funkcia preusporiada, aby bolo heap-om
- [in] length - pocet prvkov pola
- VSTUPNE PODMIENKY:
- 'data' ukazuje na platne pole, ak 'length' > 0
- 'length' moze mat lubovolnu hodnotu
- VYSTUPNE PODMIENKY:
- 'data' je heap-om
- PRIKLAD:
- vstup: data = {7, 2, 1, 2, 8, 5, 3, 4, 2, 2, 6}, length = 11
- vystup: data = {1, 2, 2, 2, 2, 5, 3, 7, 4, 8, 6}
- */
- void buildHeapSiftUp(int data[], const size_t length)
- {
- // TODO
- }
- //-------------------------------------------------------------------------------------------------
- // ULOHA (0.2 boda)
- //-------------------------------------------------------------------------------------------------
- /*
- Opravi cast heap-u (podstrom ktoreho koren ma index 'topIndex')
- Verzia heap-u je Min-heap (hodnota kazdeho uzla je mensia alebo rovna ako hodnoty vsetkych jeho nasledovnikov).
- Pouzite algoritmus sift down.
- PARAMETRE:
- [in, out] data - pole, v ktorom funkcia opravi cast heapu preusporiadanim prvkov
- [in] topIndex - index korena podstromu (casti heapu), ktory sa ma opravit
- [in] length - pocet prvkov pola
- VSTUPNE PODMIENKY:
- Podstromy prvku s indexom 'topIndex' splnaju podmienky heap (podstromy, ktorych korene su priamy nasledovnici uzla s indexom 'topIndex').
- 'data' ukazuje na platne pole
- 'topIndex' moze mat lubovolnu hodnotu
- 'length' moze mat lubovolnu hodnotu
- VYSTUPNE PODMIENKY:
- Podstrom, ktoreho koren ma index 'topIndex' splna podmienku heap.
- PRIKLADY:
- vstup: data = {55, 20, 10, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140}, topIndex = 0, length = 15
- vystup: data = {10, 20, 50, 30, 40, 55, 60, 70, 80, 90, 100, 110, 120, 130, 140}
- vstup: data = {100, 8, 2, 1, 0, 5, 6, 7, 4, 2, 3, 11, 12, 13, 14, 15, 16, 17}, topIndex = 1, length = 18
- vystup: data = {100, 0, 2, 1, 2, 5, 6, 7, 4, 8, 3, 11, 12, 13, 14, 15, 16, 17}
- */
- void siftDown(int data[], const size_t topIndex, const size_t length)
- {
- // TODO
- }
- //-------------------------------------------------------------------------------------------------
- // ULOHA (0.2 boda)
- //-------------------------------------------------------------------------------------------------
- /*
- Vytvori heap na poli 'data' preusporiadanim prvkov.
- Verzia heap-u je Min-heap (hodnota kazdeho uzla je mensia alebo rovna ako hodnoty vsetkych jeho nasledovnikov).
- Pouzitej algoritmus sift down.
- PARAMETRE:
- [in, out] data - pole, ktore funkcia preusporiada aby bolo heap-om
- [in] length - pocet prvkov pola
- VSTUPNE PODMIENKY:
- 'data' ukazuje na platne pole, ak 'length' > 0
- 'length' moze mat lubovolnu hodnotu
- VYSTUPNE PODMIENKY:
- 'data' je heap-om
- PRIKLAD:
- vstup: data = {7, 2, 1, 2, 8, 5, 3, 4, 2, 2, 6}, length = 11
- vystup: data = {1, 2, 3, 2, 2, 5, 7, 4, 2, 8, 6}
- */
- void buildHeapSiftDown(int data[], const size_t length)
- {
- // TODO
- }
- //-------------------------------------------------------------------------------------------------
- // ULOHA (0.2 boda)
- //-------------------------------------------------------------------------------------------------
- /*
- Preusporiada pole 'data' od najvacsieho prvku po najmensi.
- Pouzite algoritmus heap sort.
- PARAMETRE:
- [in,out] data - pole, ktore funkcia usporiada
- [in] length - dlzka pola
- VSTUPNE PODMIENKY:
- 'data' ukazuje na platne pole, ak 'length' > 0
- 'length' moze mat lubovolnu hodnotu
- VYSTUPNE PODMIENKY:
- Pole 'data' je usporiadane
- PRIKLAD:
- vstup: data = {7, 2, 1, 2, 8, 5, 3, 4, 2, 2, 6}, length = 11
- vystup: data = {8, 7, 6, 5, 4, 3, 2, 2, 2, 2, 1}
- */
- void heapSort(int data[], const size_t length)
- {
- // TODO
- }
- //-------------------------------------------------------------------------------------------------
- // TUTORIAL
- //-------------------------------------------------------------------------------------------------
- #define ARRAY_SIZE(arr)(sizeof(arr)/arr[0])
- void siftDown(int* data, int start, int end)
- {
- int iLeftChild = start*2 + 1;
- int iRightChild = start*2 + 2;
- int tmp = start;
- if(iLeftChild <= end && data[iLeftChild] > data[tmp])
- {
- tmp = iLeftChild;
- }
- if(iRightChild <= end && data[iRightChild] > data[tmp])
- {
- tmp = iRightChild;
- }
- if(tmp != start)
- {
- swap(data[start], data[tmp]);
- siftDown(data, tmp, end);
- }
- }
- void buildHeapSiftDown(int* data, int n)
- {
- for(int i = n/2-1; i >= 0 ; i--)
- {
- siftDown(data, i, n - 1);
- }
- }
- void heapSort(int* data, int n)
- {
- //1. faza
- buildHeapSiftDown(data, n);
- //2. faza
- while(n > 1)
- {
- //extrakcia maxima
- swap(data[0], data[n-1]);
- n--;
- siftDown(data, 0, n-1);
- }
- }
- //-------------------------------------------------------------------------------------------------
- // TESTOVANIE
- //-------------------------------------------------------------------------------------------------
- // tu mozete doplnit pomocne testovacie funkcie a struktury
- int main() {
- // tu mozete doplnit testovaci kod
- int data[20];
- generateArray(data, 20);
- heapSort(data, 20);
- printArray(data, 20);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment