Upload
others
View
47
Download
0
Embed Size (px)
Citation preview
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;
}