Nadesłany przez Emil Hotkowski, 11 lutego 2012 20:26
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
kopiec.cpp:
//Kopiec //Emil Hotkowski //www.algorytm.org #include <cstdlib> #include <iostream> #define N 5000 //maksymalna liczba elementow w kopcu using namespace std; //Deklaracja klasy kopca class kopiec{ public: int tab[N]; int size; kopiec(); void insert_into(int v); void delete_root(); void wyswietl(int poczatek); void sort(); }; //Przyklad uzycia int main(int argc, char *argv[]) { //utworz kopiec kopiec K; //wstaw elementy do kopca K.insert_into(2); K.insert_into(5); K.insert_into(3); K.insert_into(1); K.insert_into(7); //wsywietl elementy kopca poczawszy od pierwszego K.wyswietl(1); system("PAUSE"); //usun korzen i wsywietl elementy kopca poczawszy od pierwszego K.delete_root(); K.wyswietl(1); system("PAUSE"); //posortuj kopiec K.sort(); system("PAUSE"); return EXIT_SUCCESS; } //************ //METODY //************ //Konstruktor - tworzy pusty kopiec kopiec::kopiec(){ size = 0; } //Wstawia element o wartosci v do kopca void kopiec::insert_into(int v){ tab[size+1] = v; int s = size+1; while(s!=1) { if(tab[s/2] < tab[s]) { swap(tab[s/2],tab[s]);s/=2; } else break; } size++; } //Usuwa korzen kopca void kopiec::delete_root() { tab[1] = tab[size]; size--; int tmp = 1; while(tmp*2 <= size){ if(tab[tmp] < tab[tmp*2] || tab[tmp] < tab[tmp*2+1]) { if(tab[tmp*2] > tab[tmp*2+1] || tmp*2+1 > size) { swap(tab[tmp],tab[tmp*2]);tmp=tmp*2;} else { swap(tab[tmp],tab[tmp*2+1]);tmp=tmp*2+1; } } else break; } } //Sortuje kopiec void kopiec::sort() { for(int i = 0 ; i <= size; i++) { cout << tab[1] << " "; delete_root(); } cout << tab[1] << "\n"; } //Wyswietla zawartosc kopca poczawszy od elementu poczatek void kopiec::wyswietl(int poczatek){ if(poczatek <= size) { cout << poczatek << " : " << tab[poczatek] << " \n"; if(poczatek*2 <= size) wyswietl(poczatek*2); if(poczatek*2+1 <= size) wyswietl(poczatek*2+1); } }