algoritmi de cautare - utclujusers.utcluj.ro/~simona/pclp/pclp9.pdf · pclp9 - 2 algoritmi de...

25
PCLP9 - 1 Despre ce discutam astazi Algoritmi de sortare sortare prin selectie metoda bulelor Algoritmi de cautare cautare liniara cautare binara

Upload: others

Post on 10-Mar-2020

44 views

Category:

Documents


0 download

TRANSCRIPT

PCLP9 - 1

Despre ce discutam astazi

• Algoritmi de sortare

– sortare prin selectie

– metoda bulelor

• Algoritmi de cautare

– cautare liniara

– cautare binara

PCLP9 - 2

Algoritmi de sortare

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

Fie un sir a de numere intregi. Sa se ordoneze crescatorsirul.

PCLP9 - 3

Sortare prin selectie (1)#include <stdio.h>#include <stdlib.h>#define MAX 30void 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, const int *sir){ int i;

for( i=0; i<n; i++) printf (″%d ″, sir[i]) ;

printf(″\n″);}

PCLP9 - 4

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;

}

}

PCLP9 - 5

Sortare prin selectie (3)int main()

{ int n, a[MAX];

printf (″Introduceti nr. de elemente ale sirului = ″);

scanf(″%d″, &n);if(n<1 || n>MAX){ printf(″Dimensiune eronata.\n″); exit(1); }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);

return 0;

}

PCLP9 - 6

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

PCLP9 - 7

Metoda bulelor (2)#include <stdio.h>#include <stdlib.h>#define MAX 30void 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, const int *sir){ int i;

for( i=0; i<n; i++) printf (″%d ″, sir[i]) ;

printf(″\n″);}

PCLP9 - 8

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);

}

PCLP9 - 9

Metoda bulelor (4)int main()

{ int n, a[MAX];

printf (″Introduceti nr. de elemente ale sirului = ″);

scanf(″%d″, &n);if(n<1 || n>MAX){ printf(″Dimensiune eronata.\n″); exit(1); }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);

return 0;

}

PCLP9 - 10

Algoritmi de cautare

a) cautare liniara (secventiala)

- fiecare element al sirului este comparat pe rand

cu valoarea x

- este o metoda simpla dar ineficienta

Fie un sir a ordonat crescator si x o valoare. Sa se determinedaca x se afla printre elementele sirului a.

PCLP9 - 11

Cautare liniara (1)#include <stdio.h>#include <stdlib.h>#define MAX 30void 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, const int *sir){ int i;

for( i=0; i<n; i++) printf (″%d ″, sir[i]) ;

printf(″\n″);}

PCLP9 - 12

Cautare liniara (2)

void cautare(int n, const 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);

}

PCLP9 - 13

Cautare liniara (3)int main()

{ int n, a[MAX], x;

printf (″Introduceti nr. de elemente ale sirului = ″);

scanf(″%d″, &n);if(n<1 || n>MAX){ printf(″Dimensiune eronata.\n″); exit(1); }

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);

return 0;

}

PCLP9 - 14

Cautare liniara (4)

Alt mod de definire a functiei de cautare si de

apelare a ei:

int cautare2(int n, const int *sir, int nr)

{ int i;

for(i=0; i<n; i++)

if( sir[i]==nr)

return 1;

return 0;

}

PCLP9 - 15

Cautare liniara (5)int main(){ int n, a[MAX], x;

printf (″Introduceti nr. de elemente ale sirului = ″);scanf(″%d″, &n);if(n<1 || n>MAX)

{ printf(″Dimensiune eronata.\n″); exit(1); }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);return 0;

}

PCLP9 - 16

Cautare liniara (6)

Indicarea pozitiei elementului in sir:

int cautare3(int n, const int *sir, int nr){ int i;

for(i=0; i<n; i++) if( sir[i]==nr)

return i;return -1;

}

PCLP9 - 17

Cautare liniara (7)int main(){ int n, a[MAX], x, p;

printf (″Introduceti nr. de elemente ale sirului = ″);scanf(″%d″, &n);if(n<1 || n>MAX){ printf(″Dimensiune eronata.\n″); exit(1); }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);return 0;

}

PCLP9 - 18

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

PCLP9 - 19

Cautare binara (2)#include <stdio.h>#include <stdlib.h>#define MAX 30void 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, const int *sir){ int i;

for( i=0; i<n; i++) printf (″%d ″, sir[i]) ;

printf(″\n″);}

PCLP9 - 20

Cautare binara (3)void cautare_bin(int n, const int *sir, const int nr){ int p=0, u=n-1, m, gasit=0;

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);}

PCLP9 - 21

Cautare binara (4)int main()

{ int n, a[MAX], x;

printf (″Introduceti nr. de elemente ale sirului = ″);

scanf(″%d″, &n);if(n<1 || n>MAX){ printf(″Dimensiune eronata.\n″); exit(1); }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);

return 0;

}

PCLP9 - 22

Cautare binara (5)Alt mod de definire a functiei de cautare si de apelare a ei:

int cautare_bin2(int n, const int *sir, const 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;

}

PCLP9 - 23

Cautare binara (6)int main(){ int n, a[MAX], x;

printf (″Introduceti nr. de elemente ale sirului = ″);scanf(″%d″, &n);if(n<1 || n>MAX){ printf(″Dimensiune eronata.\n″); exit(1); }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);return 0;

}

PCLP9 - 24

Cautare binara (7)Indicarea pozitiei elementului in sir:

int cautare_bin3(int n, const int *sir, const 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;

}

PCLP9 - 25

Cautare binara (8)int main(){ int n, a[MAX], x, p;

printf (″Introduceti nr. de elemente ale sirului = ″);scanf(″%d″, &n);if(n<1 || n>MAX){ printf(″Dimensiune eronata.\n″); exit(1); }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);return 0;

}