Forum » Programiranje » [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:
Hvala vsem za pomoc!
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 ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | največkrat pojavljeni element v tabeliOddelek: Programiranje | 1974 (1349) | pac1 |
» | Za programerske teoretikeOddelek: Programiranje | 8832 (5634) | Jerry000 |
» | c++ in linux/windowsOddelek: Programiranje | 1742 (1618) | rapvirus |
» | Iskanje naslednje ponovitve - najboljši algoritem (strani: 1 2 )Oddelek: Programiranje | 4468 (3526) | Thomas |
» | sortiranje neznano dolge datoteke v pascaluOddelek: Programiranje | 1060 (975) | mmisv |