5 Pretraivanje i sortiranje zasnovano na rekurziji apstraktne

  • Slides: 13
Download presentation
5. Pretraživanje i sortiranje zasnovano na rekurziji, apstraktne strukture podataka 5. 1. Rekurzivni postupci

5. Pretraživanje i sortiranje zasnovano na rekurziji, apstraktne strukture podataka 5. 1. Rekurzivni postupci pretraživanja i sortiranja Neki postupci pretraživanja i sortiranja po svojoj prirordi su rekurzivni. U takvim postupcima prirodno se primenjuje rekurzija. 5. 1. 1. Binrno pretraživanje zasnovano na rekurziji. binrek. cpp, binrek 1. cpp. 5. 1. 2. Quick-sort algoritam Postoji jedan način za sortiranje nizova nazvan "quick sort“. Ovaj metod je preložio C. A. R. Hoare godine 1962. Metod je posebno efikasan za nizove većih dimenzija.

Algoritam za brzo sortirnje je po svojoj prirodi rekurzivan. Zasniva se na strategiji “podeli

Algoritam za brzo sortirnje je po svojoj prirodi rekurzivan. Zasniva se na strategiji “podeli pa osvoji”. Osnovna ideja je sledeća: • podeliti niz na 2 dela tako d au 1. delu svaki element niza bude manji od elemenata u 2. delu • neki element između ova 2 dela je na svom mestu • ponoviti postupak za prvi i drugi podniz. Ovaj postupak je primenjn u sledećim primerima uz neznate razlike u realizaciji. qsort. cpp. qsort 1. cpp, qsort 2. cpp Broj operacija: biramo granični element x i prolazimo duž celog niza – tj. ukupan broj operacija je n. Ako smo stalno birali sredinu, imammo log (n) prokaza. Znači, ukupan broj poređenja je nlog(n). Ukupan broj poređenja iznosi O(n/6). Dakle, ukupan broj operacija je O(nlogn).

Postoji ugrađena funkcija za sortiranje u C-u. Njen naziv je qsort i ima sledeći

Postoji ugrađena funkcija za sortiranje u C-u. Njen naziv je qsort i ima sledeći prototip: void qsort (void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); Prvi argument je pokazivač na početak niza (može se odnositi na bilo koju vrstu niza). Drugi argument je broj članova koji se sortiraju. Treći argument se odnosi na veličinu objekata koji se sortiraju. Četvrti argument je pokazivač na funkciju koja određuje redosled sortiranja i ona ima 2 argumenta. Qsorteng. cpp

5. 2. Apstraktne strukture podatka Opis dinamičkih i statičkih struktura podataka. 5. 2. 1

5. 2. Apstraktne strukture podatka Opis dinamičkih i statičkih struktura podataka. 5. 2. 1 Alokacija memorije Za svaki program mora se izvršiti alokacija memorije (rezervisanje memorijskog prostora) za smeštanje podataka. To se nekad čini automatski. Na primer: float x; char niska[] = “Voli Marko vino"; a nekada eksplicno navodimo koliko memorije rezervišemo: int celi[100]; Takva alokacija memorije naiziva se statička alokacija.

5. 2. 1. 1. Statička alokacija memorije se dešava za vreme prevođenja programa (pre

5. 2. 1. 1. Statička alokacija memorije se dešava za vreme prevođenja programa (pre izvršavanja). Statičke promenljive ostaju u memoriji sve dok se koristi (dok se izvršava) program. (Jezik C 99 je malo specifičan jer omogućava promenljivu veličinu niza. ) Ako su podaci deklarisani kao statički u nekoj funkciji, oni su lokalni za tu funkciju i ne može im se pristupiti iz drugih modula.

5. 2. 1. 2. Dinamička alokacija memorije Međutim, u programu se može rezervisati memorija

5. 2. 1. 2. Dinamička alokacija memorije Međutim, u programu se može rezervisati memorija i pomoću specijalnih funkcija za vreme izvšavanja programa. Takva alokacija memorije naziva se dinamičkom. Objekat u dinamički alociranoj memoriji ostaje sve dok ga korisnik sam eksplicitno ne ukloni (ili ga ne ukloni neki skupljač otpadaka ako takav mehanizam postoji u samom jeziku). Ovako alociran objekat ima dinamičko vreme trajanja. Kako se rešava problem dinamičke alokacije memorije? Postoje različiti postupci (načini) za dinamičku alokaciju memorije:

preko blokova fiksne veličine preko deljenih blokova (buddy-blocks) na hip (heap) - morije Heap-

preko blokova fiksne veličine preko deljenih blokova (buddy-blocks) na hip (heap) - morije Heap- memorija je velika količina slobodne memorije kojoj se pristupa mahom preko popkazivača i podaci ostaju upisani dok se eksplicitno ne uklone. Nasuprot heap memoriji je stek-memorija koja je obično manjeg kapaciteta i objekti u njoj postoje samo za vreme izvtšavanja neke funkcije.

Za rezervisanje memorije (u programskom jeziku C) , koristi se funkcija: malloc() Ova funkcija

Za rezervisanje memorije (u programskom jeziku C) , koristi se funkcija: malloc() Ova funkcija ima 1 argument koji određuje broj rezervisanih bajtova. Alociranoj memoriji se ne dodeljuje ime. Ona vraća adresu prvog bajta u alociranom bloku i ta adresa se može dodeliti nekom pokazivaču. Dakle ovde se koristi heap za smeštanje podataka. Za oslobađanje memorije (razrešenje dinamičke promenljive), koristi se funkcija: free(<adresa>) (obično, free(<pokazivac>) )

Kada se koriste ove funkcije, treba uključiti zaglavlje: <alloc. h> (ili <stdlib. h>) Funkcija

Kada se koriste ove funkcije, treba uključiti zaglavlje: <alloc. h> (ili <stdlib. h>) Funkcija malloc() se deklariše na sledeći način (počev od C 99 koristi se void umesto char, što je opštije. ) char *malloc (usigned <broj_uzastopnih_bajtova>) Ova funkcija je u uskoj vezi sa operatorom sizeof (<izraz>) – vraća veličinu mem. prostora za čuvanje izraza. Ako napišemo: struct pok *nesto; nesto = (struct pok *) malloc(5*sizeof(struct pok)); rezerviše se 5 lokacija za smeštanje navedene strukture. Ako malloc() ne može da alocira zahtevanu memoriju, vraća null pointer.

Ako napišemo: double * ptd; ptd = (double *) malloc(50 * sizeof(double)); ovim je

Ako napišemo: double * ptd; ptd = (double *) malloc(50 * sizeof(double)); ovim je rezervisan prostor od 50 double vrednosti i njima se može pristupiti preko pokazivača: ptd[0], ptd[1], …

U poslednjem primeru kreiran je jedan dinamički niz. Niz se, praktično, kreira dok se

U poslednjem primeru kreiran je jedan dinamički niz. Niz se, praktično, kreira dok se program izvršava i mi možemo za vreme izvršavanja programa da određujemo dužinu niza. (Do sada smo kreirali samo statičke nizove). Dakle, možemo pisati: ptd = (double *) malloc(n * sizeof(double)); (Počev od C 99 postoji i 2. način za kreiranje dinamičkih nizova. ) Pored funkcije malloc() može se koristiti i funkcija calloc() koja ima 2 argumenta. char *malloc (usigned <broj_podatka>, usigned <duzina_podatka>) Na primer, možemo pisati: long * proizvod; proizvod = (long *)calloc(100, sizeof (long)); Za razrešenje mem. prostora i u ovom slučaju se koristi funkcija free().

5. 2. 1. Povezane liste Opis povezane liste. Kreiranje povezane liste i način rada

5. 2. 1. Povezane liste Opis povezane liste. Kreiranje povezane liste i način rada sa povezanim listama. Povezana 1. cpp

5. 2. 2. Stekovi i redovi Opis steka. Opis reda. Opis načina rada s

5. 2. 2. Stekovi i redovi Opis steka. Opis reda. Opis načina rada s astekovima i redovaima.