» »

[NALOGA][JAVA] - algoritem

[NALOGA][JAVA] - algoritem

bijonda ::

Naloga se glasi:
Elementi so shranjeni v kopici. Sestavi algoritem s katerim jih preložiš v tabelo tako, da so v tabeli urejeni.

Jaz sem napisala algoritem, samo nisem prepričana, če je prou. Prosila bi vas, ce bi lahko pogledala, ce je v redu. Ce pa kaj ni ok, bi pa prosila, ce bi mi povedali kaj ni prou in
kako se popravi, ker sem ostala ze brez idej. :'(

Spodaj sem dodala svoje algoritem in postopek, kako naj bi se kopica resevala oz
kako naj bi algoritem potekal:

Postopek:
* imamo tabelo, ki predstavlja kopico, z n elementi
* vemo da je prvi element tabele (kopica[1]) max elemet tabele
* zamenjamo prvi in zadnji element tabele, kopica[1] in kopica[n]
* sedaj element kopica[1] potopimo na ustrezno mesto v kopici oziroma v tabeli, ki ima
sedaj n - 1 elementon (sedaj je kopica: kopica[1],..., kopica[n - 1])
* zamenjamo podatka kopica[1] in kopica[n - 1]
* zopet potopimo vrhnji elemen na ustrezno mesto v kopici
* sedaj ima kopica n - 2 elementa (kopica je: kopica[1],..., kopica[n - 2]) o kopica[n] je
največji element v kopici, kopica[n - 1] pa je drugi največji element v kopici
* ponovno zamenjamo podatka kopica[1] in kopica[n - 2]
* potopimo vrhnji elemen na ustrezno mesto v kopici
* sedaj ima kopica n - 3 elementi (kopica je: kopica[1],..., kopica[n - 3])
* ...
* tako ponavljamo doker ne pridemo od kopica[2] elementa


Koda:
 // sprehodimo se po tabeli
for(int i = 1; i <= n - 1; i++){
   // zamenjamo prvi in zadnji element
   // v element shranimo prvi element kopice, za katerega vemo da je max
   element = kopica[1];  
   tab[1] = kopica[n - i + 1]; // novi prvi element v tabeli
   tab[n - i + 1] = element; // novi zadnji element v tabeli

   // potapljamo novi prvi element v smeri najvecjega sina
   for(int j = 1; j <= n - i + 1; j++){
      leviSin = tab[2 * j];
      desniSin = tab[2 * j +1 ];
      oce = tab[j];

      // ponavljamo dokler je kandidat za sina znotraj tabele
      while(2 * j + 1 <= n - i + 1){
         // pregledamo oceta in sinove

         // oce je manjsi od obeh sinov
         if(oce < leviSin && oce < desniSin){ 

            // levi sin je manjsi od desnega sina
            if(leviSin < desniSin){
               // zamenjamo oceta in desnega sina
               pom = oce;
               oce = desniSin;
               desniSin = pom;
            }
            // levi sin je vecji od desnega 
            else if(leviSin > desniSin){
               // zamenjamo oceta in levega sina
               pom = oce;
               oce = leviSin;
               leviSin = pom;
            }
         }

         // oce je manjsi od levega sina, a je vecji od desnega sina
         if(oce < leviSin && oce > desniSin){ 
            // zamenjamo oceta in levega sina
            pom = oce;
            oce = leviSin;
            leviSin = pom;
         }

         // oce manjsi od desnega sina, a vecji od levega sina
         if else(oce > leviSin && oce < desniSin){ 
            // zamenjamo oceta in desnega sina
            pom = oce;
            oce = desniSin;
            desniSin = pom;
         }

         // oce je vecji od sinov
         else {
           // nic ne naredimo
           // pustimo kakor je
         }
         j++;
      }   // while
   // for od potapljanja
// for od sprehajanja po tabeli



Hvala vsem za pomoc!

Gundolf ::

Algoritem, kot si ga opisala, je že v redu, za kodo pa ne bi vedel. Ampak nekaj me pa le muči. Zakaj je tvoj index 1-based (prvi element ima index 1)?

miha22 ::

Sicer smo tudi mi na faksu zaradi poenostavitve enačb začeli v tabeli s prvim elementom tabela[1] namesto tabela[0], vendar če malce pomisliš kmalu ugotoviš da so spremembe na enačbah za posamezne elemente povsem trivialne tudi če začneš z elementom tabela[0].

bijonda ::

Tako smo se zmenil, da je pri kopicah oz drevesih, vedno prvi element tab[1], drugace pa je tab[0] prvi element.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

največkrat pojavljeni element v tabeli

Oddelek: Programiranje
181852 (1227) pac1
»

Za programerske teoretike

Oddelek: Programiranje
478534 (5336) Jerry000
»

c++ in linux/windows

Oddelek: Programiranje
121633 (1509) rapvirus
»

Iskanje naslednje ponovitve - najboljši algoritem (strani: 1 2 )

Oddelek: Programiranje
724259 (3317) Thomas
»

sortiranje neznano dolge datoteke v pascalu

Oddelek: Programiranje
10992 (907) mmisv

Več podobnih tem