Formulacija problema: Neka je dato n elemenata v[0],v[1],..,v[n-1] takvih da v[0] <= v[1] <=...
<=v[n-1].
Za zadati element x ustanoviti da li se on pojavljuje u nizu v.
Rešenje:
int cmp(const void *p1, const void *p2)
{ int i= *(int *)p1; /* vraca ceo broj na koji se pokazuje */
int j= *(int *)p2;
return ( i < j ? -1 : (i==j ? 0: 1) );
}
void main()
{
int dNiz[]={-1, 3, 8, 26, 28, 29, 30, 35, 45};
int i=30;
void *p=bsearch(&i, dNiz, 9, sizeof(int), &cmp);
if (p==NULL) printf("\nnije nadjen\n"); else printf("\nPronadjen je i\n");
}
Formulacija problema:Zadatih n elemenata a[0],a[1],..,a[n-1] urediti u neopadajući poredak.
Rešenje: niz različitih indeksa 0<=i1,i2,..., in <=n-1 tako da vazi: a[i1] <= a[i2] <=... <=a[in]
Bubble sort Selection sort Quick sort
Na početak niza koji se soritira pokazuje niz, broj je broj elemenata, velicina je veličina svakog elementa u bajtovima. Argument poredi je adresa funkcije za poređenje koja vraća negativan broj, nulu ili pozitivan broj zavosno da li je prva vrednost na koju se pokazuje manja, jednaka ili veća od druge vrednosti. Funkcija dobija pokazivače na elemente. Pokazivači su deklarisani kao void * da bi ponovo bili u f-ji konvertovani u pravi tip.
Primer koji sledi sortira niz celih brojeva. Funkcija cmp radi sa pokazivačima tipa int * koji se prosleđuju kao da su tipa void *. Potom se u f-ji konvertuju u tip int *, a potom derefenciraju da bi se radilo sa celobrojnim vrednostima i, j.
int cmp(const void *p1, const void *p2)
{ int i= *(int *)p1; /* vraca ceo broj na koji se pokazuje */
int j= *(int *)p2;
return ( i < j ? -1 : (i==j ? 0: 1) );
}
void main()
{
int i, dNiz[]={-1, 3,-8, 26, -28, 29, -30, 35, -45};
qsort(dNiz, 9, sizeof(int), &cmp);
for (i=0; i < 9; i++) printf("%d ", dNiz[i]);
}
Ako se sortira niz stringova, onda svaki eement je sam po sebi pokazivač tipa char *,
te f-ja cmp tada prima podatke tipa char ** koji se konvertuju u svoj tip i derefenciraju radi dobijanja podataka tipa char *. Na primer
int cmp(const void *p1, const void *p2) { char *s1= *(char **)p1; /* p1 je pokazivac na element niza stringova, tj. tipa char **, a f-ja cmp mora da radi sa podatkom tipa char * tj. f-ja strcmp */ char *s2= *(char **)p2; return ( strcmp (s1,s2) ); }
Naslovna | Primene sortiranja u zadacima |