Sunteți pe pagina 1din 25

Despre ce discutam astazi

• Algoritmi de cautare
– cautare liniara
– cautare binara

• Algoritmi de sortare
– sortare prin selectie
– metoda bulelor
PCLP12 - 1
Algoritmi de cautare
Fie un sir a ordonat crescator si x o valoare. Sa se determine
daca x se afla printre elementele sirului a.

a) cautare liniara (secventiala)


- fiecare element al sirului este comparat pe rand
cu valoarea x
- este o metoda simpla dar ineficienta

PCLP12 - 2
Cautare liniara (1)
#include <stdio.h>
#define MAX 30
void citire_sir(int n, int sir[])
{ int i;
for( i=0; i<n; i++)
{ printf (″el[%d]=″, i+1) ;
scanf(″%d″, &sir[i]);
}
}
void afisare_sir(int n, int sir[])
{ int i;
for( i=0; i<n; i++)
printf (″%d ″, sir[i]) ;
printf(″\n″);
}
PCLP12 - 3
Cautare liniara (2)
void cautare(int n, int sir[], int nr)
{ int i;
for(i=0; i<n; i++)
if( sir[i]==nr)
break;
if (i<n)
printf(″\nnumarul %d este in sir\n″, nr);
else
printf(″\nnumarul %d nu este in sir\n″, nr);
}

PCLP12 - 4
Cautare liniara (3)
void main()
{ int n, a[MAX], x;
printf (″Introduceti nr. de elemente ale sirului = ″);
scanf(″%d″, &n);
printf (″\nIntroduceti elementele sirului:\n″) ;
citire_sir(n, a);
printf (″\nIntroduceti nr. cautat = ″);
scanf(″%d″, &x);
printf (″\nSirul a: ″) ;
afisare_sir(n, a);
cautare(n, a, x);
}
PCLP12 - 5
Cautare liniara (4)
Alt mod de definire a functiei de cautare si de
apelare a ei:
int cautare2(int n, int sir[], int nr)
{ int i;
for(i=0; i<n; i++)
if( sir[i]==nr)
return 1;
return 0;
}
PCLP12 - 6
Cautare liniara (5)
void main()
{ int n, a[MAX], x;
printf (″Introduceti nr. de elemente ale sirului = ″);
scanf(″%d″, &n);
printf (″\nIntroduceti elementele sirului:\n″) ;
citire_sir(n, a);
printf (″\nIntroduceti nr. cautat = ″);
scanf(″%d″, &x);
printf (″\nSirul a: ″) ;
afisare_sir(n, a);
if (cautare2(n, a, x))
printf(″\nnumarul %d este in sir\n″, x);
else
printf(″\nnumarul %d nu este in sir\n″, x);
}
PCLP12 - 7
Cautare liniara (6)
Indicarea pozitiei elementului in sir:
int cautare3(int n, int sir[], int nr)
{ int i;
for(i=0; i<n; i++)
if( sir[i]==nr)
return i;
return -1;
}

PCLP12 - 8
Cautare liniara (7)
void main()
{ int n, a[MAX], x, p;
printf (″Introduceti nr. de elemente ale sirului = ″);
scanf(″%d″, &n);
printf (″\nIntroduceti elementele sirului:\n″) ;
citire_sir(n, a);
printf (″\nIntroduceti nr. cautat = ″); scanf(″%d″, &x);
printf (″\nSirul a: ″) ;
afisare_sir(n, a);
if ((p=cautare3(n, a, x)) != -1)
printf(″\nnumarul %d este pe pozitia %d in sir\n″, x, p+1);
else
printf(″\nnumarul %d nu este in sir\n″, x);
}
PCLP12 - 9
Cautare binara (1)
b) cautare binara
- este o metoda mai rapida
- se compara elementul din mijlocul sirului,
a[(n-1)/2] cu valoarea x
- daca sunt egale atunci am gasit numarul in sir
- daca x < a[(n-1)/2] se continua cautarea in
subsirul din stanga
- daca x > a[(n-1)/2] se continua cautarea in
subsirul din dreapta

PCLP12 - 10
Cautare binara (2)
#include <stdio.h>
#define MAX 30
void citire_sir(int n, int sir[])
{ int i;
for( i=0; i<n; i++)
{ printf (″el[%d]=″, i+1) ;
scanf(″%d″, &sir[i]);
}
}
void afisare_sir(int n, int sir[])
{ int i;
for( i=0; i<n; i++)
printf (″%d ″, sir[i]) ;
printf(″\n″);
} PCLP12 - 11
Cautare binara (3)
void cautare_bin(int n, int sir[], int nr)
{ int p=0, u=n-1, gasit=0, m;
while(p<=u)
{ m=(p+u)/2;
if( sir[m]==nr)
{ gasit=1;
break;
}
if (nr < sir[m])
u=m-1;
else
p=m+1;
}
if (gasit)
printf(″\nnumarul %d este in sir\n″, nr);
else
printf(″\nnumarul %d nu este in sir\n″, nr);
}
PCLP12 - 12
Cautare binara (4)
void main()
{ int n, a[MAX], x;
printf (″Introduceti nr. de elemente ale sirului = ″);
scanf(″%d″, &n);
printf (″\nIntroduceti elementele sirului:\n″) ;
citire_sir(n, a);
printf (″\nIntroduceti nr. cautat = ″);
scanf(″%d″, &x);
printf (″\nSirul a: ″) ;
afisare_sir(n, a);
cautare_bin(n, a, x);
}
PCLP12 - 13
Cautare binara (5)
Alt mod de definire a functiei de cautare si de apelare a ei:
int cautare_bin2(int n, int sir[], int nr)
{ int p=0, u=n-1, m;
while(p<=u)
{ m=(p+u)/2;
if( sir[m]==nr)
return 1;
if (nr < sir[m])
u=m-1;
else
p=m+1;
}
return 0;
}
PCLP12 - 14
Cautare binara (6)
void main()
{ int n, a[MAX], x;
printf (″Introduceti nr. de elemente ale sirului = ″);
scanf(″%d″, &n);
printf (″\nIntroduceti elementele sirului:\n″) ;
citire_sir(n, a);
printf (″\nIntroduceti nr. cautat = ″);
scanf(″%d″, &x);
printf (″\nSirul a: ″) ;
afisare_sir(n, a);
if (cautare_bin2(n, a, x))
printf(″\nnumarul %d este in sir\n″, x);
else
printf(″\nnumarul %d nu este in sir\n″, x);
}
PCLP12 - 15
Cautare binara (7)
Indicarea pozitiei elementului in sir:
int cautare_bin3(int n, int sir[], int nr)
{ int p=0, u=n-1, m;
while(p<=u)
{ m=(p+u)/2;
if( sir[m]==nr)
return m;
if (nr < sir[m])
u=m-1;
else
p=m+1;
}
return -1;
}
PCLP12 - 16
Cautare binara (8)
void main()
{ int n, a[MAX], x, p;
printf (″Introduceti nr. de elemente ale sirului = ″);
scanf(″%d″, &n);
printf (″\nIntroduceti elementele sirului:\n″) ;
citire_sir(n, a);
printf (″\nIntroduceti nr. cautat = ″); scanf(″%d″, &x);
printf (″\nSirul a: ″) ;
afisare_sir(n, a);
if ((p=cautare3(n, a, x)) != -1)
printf(″\nnumarul %d este pe pozitia %d in sir\n″, x, p+1);
else
printf(″\nnumarul %d nu este in sir\n″, x);
}
PCLP12 - 17
Algoritmi de sortare
Fie un sir a ordonat. Sa se ordoneze crescator sirul.

a) Sortarea prin selectie


- se cauta minimul si se pune pe prima pozitie,
apoi se cauta minimul din subsirul ramas si se pune
pe a doua pozitie, etc.
- este o metoda simpla
- necesita un numar de pasi direct proportional cu
patratul numarului de elemente ale sirului

PCLP12 - 18
Sortare prin selectie (1)
#include <stdio.h>
#define MAX 30
void citire_sir(int n, int sir[])
{ int i;
for( i=0; i<n; i++)
{ printf (″el[%d]=″, i+1) ;
scanf(″%d″, &sir[i]);
}
}
void afisare_sir(int n, int sir[])
{ int i;
for( i=0; i<n; i++)
printf (″%d ″, sir[i]) ;
printf(″\n″);
} PCLP12 - 19
Sortare prin selectie (2)
void sortare_selectie(int n, int sir[])
{ int i,j,t;
for(i=0; i<n-1; i++)
for(j=i+1; j<n; j++)
if( sir[i]>sir[j])
{ t=sir[i];
sir[i]=sir[j];
sir[j]=t;
}
}

PCLP12 - 20
Sortare prin selectie (3)
void main()
{ int n, a[MAX];
printf (″Introduceti nr. de elemente ale sirului = ″);
scanf(″%d″, &n);
printf (″\nIntroduceti elementele sirului:\n″) ;
citire_sir(n, a);
printf (″\nSirul a: ″) ;
afisare_sir(n, a);
sortare_selectie(n, a);
printf (″\nSirul sortat: ″) ;
afisare_sir(n, a);
}
PCLP12 - 21
Metoda bulelor (1)
b) Metoda bulelor
- se compara elementele consecutive si se
schimba intre ele daca nu sunt in relatia dorita
- se parcurge de atatea ori sirul pana cand nu se
mai face nici o schimbare la parcurgerea lui
- este o metoda simpla
- necesita un numar de pasi direct proportional
cu patratul numarului de elemente ale sirului

PCLP12 - 22
Metoda bulelor (2)
#include <stdio.h>
#define MAX 30
void citire_sir(int n, int sir[])
{ int i;
for( i=0; i<n; i++)
{ printf (″el[%d]=″, i+1) ;
scanf(″%d″, &sir[i]);
}
}
void afisare_sir(int n, int sir[])
{ int i;
for( i=0; i<n; i++)
printf (″%d ″, sir[i]) ;
printf(″\n″);
} PCLP12 - 23
Metoda bulelor (3)
void metoda_bulelor(int n, int sir[])
{ int i,t,ordonat;
do
{ ordonat=1;
for(i=0; i<n-1; i++)
if( sir[i]>sir[i+1])
{ t=sir[i];
sir[i]=sir[i+1];
sir[i+1]=t;
ordonat=0;
}
}while(!ordonat);
}
PCLP12 - 24
Metoda bulelor (4)
void main()
{ int n, a[MAX];
printf (″Introduceti nr. de elemente ale sirului = ″);
scanf(″%d″, &n);
printf (″\nIntroduceti elementele sirului:\n″) ;
citire_sir(n, a);
printf (″\nSirul a: ″) ;
afisare_sir(n, a);
metoda_bulelor(n, a);
printf (″\nSirul sortat: ″) ;
afisare_sir(n, a);
}
PCLP12 - 25

S-ar putea să vă placă și