Sortiranje niza

Sortiranje niza

offline
  • Pridružio: 29 Jan 2016
  • Poruke: 4

Ne kontam gde je greska u ovoj funkciji koja treba da preuzme brojeve iz Niza da ih sortira i vrati u main.

 void sortingArray(int sortArray[], int sizeOfArray)      {        int zamena;        do        {          zamena=0;          for (int p=0;p<sizeOfArray;p=p+1)           {             if(sortArray[p]>sortArray[p+1])              {              int privremeni = sortArray[p];              sortArray[p]=sortArray[p+1];              sortArray[p+1]=privremeni;              zamena=1;              }           }        }          while (zamena==1);      }



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Programer
  • Pridružio: 23 Maj 2012
  • Poruke: 4575

Greška nije u samom programu već u definisanju funkcije - drugi parametar ti je dužina niza za koju je najbolje da koristiš sledeću varijantu:

int duzina = sizeof(niz) / sizeof(int);

Funkcija inače radi okej. Kod nizova brojanje počinješ od nule.



offline
  • Pridružio: 29 Jan 2016
  • Poruke: 4

Drugi parametar jeste duzina niza, posto je kod mene konstantna mogao sam ukucati da bude 7, a ne da je prosledjujem iz main-a, mada sam procitao da bih trebao da se drzim prakse da u funkciji ne upisujem duzinu, nego da je prosledjujem zbog toga sto mozda nece uvek biti ista u svim programima pa cisto da mi udje u praksu, a brojanje pocinje od nule u for petlji i navedeno je da broji < sizeOfArray koji je kao sto rekoh uvek 7, a i prosledjujem ga kao 7 iz main-a. Posto sam tek pocetnik u c++ i ucim iz tutorijala, ne shvatam sta si hteo da kazes sa:
int duzina = sizeof(niz) / sizeof(int);

Malo sam jos istrazivao po google-u i nasao da bez obzira sto nisam ukucao * funkciji je niz predat kao pointer, ali jednostavno ne vidim problem sa drugim parametrom, jer sam naveo "sizeOfArray" kao ime, a ne kao "sizeof()" da vadi duzinu iz necega.

offline
  • Pridružio: 15 Maj 2009
  • Poruke: 963

Preko te formule se može odrediti koliko niz ima elemenata.
sizeof(niz) ti vraća koliko bajtova zauzima ceo niz i kad taj broj podeliš sa brojem bajtova koje zauzima jedan element tog niza dobiješ broj elemenata niza.
A jedan element tog niza zauzima onoliko bajtova koliko inače zauzima promenljiva tipa int jer je to niz intova pa se kaže sizeof(int), mada je bolja praksa reći sizeof(niz) / sizeof(niz[0]) u slučaju da se odlučiš u nekom trenutku da promeniš tip niza u float pa da ne bi morao i u formuli da menjaš int sa float.

Nego zašto kažeš ima greška, jel postoji primer kada ne daje tačne rezultata ili?

offline
  • Srđan Tot
  • Am I evil? I am man, yes I am.
  • Pridružio: 12 Jul 2005
  • Poruke: 2483
  • Gde živiš: Ljubljana

Ako bih morao da pogađam u čemu je problem, rekao bih da se funkcija izvrši bez greške, ali da se rezultat ne vrati u main funkciju. u main funkciji, niz ostane nesortiran tj. isti kakav je bio pre poziva funkcije sortingArray. Da li je to problem ili nešto drugo?

offline
  • Pridružio: 15 Maj 2009
  • Poruke: 963

Mislim da sam našao Very Happy

For petlja treba da vrti do pretposlednjeg člana a ne do poslednjeg jer se u petlji upoređuje trenutni član sa sledećim. Ako vrti do poslednjeg onda se taj član upoređuje sa nekom vrednošću koja se nalazi van granica niza.

Dakle,
for (int p = 0; p < sizeOfArray - 1; p = p + 1)

Sve vrednosti van granica niza su kod mene bile veće od 4.000.000 tako da osim ako se ne ubaci neki član u nizu veći od 4.000.000 sortiranje će se izvršiti ispravno. Testirao sam šta će se desiti ako napravim niz sa svim 80.000.000 i niotkuda se stvorila 4.200.958 u mom nizu Very Happy

Kada se sortira niz u opadajućem poretku postojanje greške je očigleno:
1, 2, 3, 4, 5 -> 4200958 5 4 3 2

Btw funkcija nema šta da vraća glavnoj funkciji jer kada se niz prosleđuje kao parametar prosledi se pokazivač na prvi element u originalnom nizu tako da su sve promene nad nizom izvršene u nekoj funkciji trajne i vidljive svuda.

offline
  • Pridružio: 11 Apr 2012
  • Poruke: 98

Da definitivno je to greska...eto koliko jedno -1 menja krajnji rezultat (narocito ako nedostaje u uslovu neke petlje) Smile

offline
  • Pridružio: 29 Jan 2016
  • Poruke: 4

Hvala Vam svima na odgovoru. Skontao sam kasnije da je u pitanju ukupan broj bajtova svih clanova niza podeljeno sa brojem bajtova jednog clana. Nisam znao da kad se niz predaje funkciji predaje se ustvari kao pointer mada se ne koristi *, pa pretrazujuci po google sam naisao i na taj odgovor. A inace nije moglo biti problem u prosledjivanju broja clanova niza iz main-a, jer sam kasnije u samostalnom pokusaju da otkrijem gde je greska izbacio funkciju i samo njeno sortiranje ubacio u main gde sam hteo da se izvrsi sortiranje i uvideo da dolazi do iste greske. Naime greska je bila da prva dva broja koja pokaze su ista, to jest prvi u nizu broj nakon sortiranja je isti kao i drugi, a ostatak niza je lepo sortiran. I nisam uvideo gresku koju je elzike7 pronasao jer sam kontao da treba da se vrsi sortiranje onoliko puta koliko ima clanova niza pocevsi od 0 kao prvog clana. GUZ - Glavom U Zid
Jos jendom hvala svima koji su se potrudili da mi pomognu. Bice tu jos pitanja kad naletim na jos neki problem heheeheh.

Ko je trenutno na forumu
 

Ukupno su 1013 korisnika na forumu :: 50 registrovanih, 5 sakrivenih i 958 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: A.R.Chafee.Jr., aramis s, babaroga, bladesu, Bobrock1, BORUTUS, Bubimir, darios, Denaya, doktor1964, dule10savic, FOX, Frunze, havoc995, ivan1973, JimmyNapoli, karevski, Karla, kolle.the.kid, kybonacci, laurusri, Marko Marković, Mcdado, mercedesamg, Mi lao shu, mikrimaus, mile23, milenko crazy north, miodrag, nemkea71, Nobunaga, Oscar, pacika, Panter, Pohovani_00, radoznao, sasa87, Simon simonović, Sir Budimir, slonic_tonic, solic, SR-3m, Srki94, ss10, stagezin, stalja, Vlada78, zdrebac, |_MeD_|, 125