Documente Academic
Documente Profesional
Documente Cultură
Algoritmi i tehnici de
programare
Cursul 3
+
Cuprins
Divide et Impera
Interclasare
Sortare rapid
Sortarea Shell
+
Cutare secvenial
Presupunem
Dac
+
Cutare secvenial
#include<stdio.h>
int cautare(int x[100],
int n, int a)
{
int gasit=0,i;
for(i=0;i<n;i++)
if(a==x[i]) gasit=1;
return gasit;
}
void main()
{
int x[100],n,a,i,g;
printf("n="); scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("x[%d]=",i);
scanf("%d",&x[i]);
}
printf("valoarea cautata=");
scanf("%d",&a);
g=cautare(x,n,a);
if(g==1)
printf("valoarea %d se gaseste in sir",a);
else
printf("valoarea %d nu se gaseste in sir",a);
}
+
Cutare secvenial
Cautarea secvenial rapid
bool cautare(int x[100],int n, int a)
{
bool gasit=false,
int i=0;
while ( ( v[i]!=x ) && ( i<n ) )
i++;
if(i<n) gasit=true;
return gasit;
}
+
Cutare binar
Dac
Unul
Acest
+
Cutare binar
Notm
Se
Dac
Dac
+
Cutare binar
int cautare(int v[], int n, int k)
{
int u, p, gasit=-1,m;
p = 0;
u = n - 1;
while(p <= u)
{ m = (p + u) / 2;
if (k == v[m])
{
gasit=m;
p = u + 1;
}
else
if (k < v[m]) u = m - 1;
else p = m + 1;
}
return gasit;
}
+
Cutare binar - recursiv
int cauta(int v[], int p, int u, int k)
{ if (p > u) return -1;
else
{
int m = (p + u) / 2;
if(k < v[m])
return cauta(v, p, m-1, k);
else
if(k > v[m])
return cauta(v, m+1, u, k);
else
return m;
}
}
+
Metoda Divide et Impera
+
Metoda Divide et Impera
Probleme
Cautarea
clasice
binar
Maximul dintr-un vector
Turnurile din Hanoi
Sortarea prin interclasare
Sortarea rapid
+
Metoda Divide et Impera
Cautarea binar
+
Metoda Divide et Impera
Apel:
+
Metoda Divide et Impera
Turnurile
din Hanoi
Apel:
unsigned a, b, c, n;
hanoi(n,a,b,c);
+
Interclasare
+
Interclasare
void interclasare(int x[10], int y[10], int
z[10],int n, int m, int *k)
{
int i,j;
i=0;j=0;*k=0;
while((i<m)&&(j<n))
{
if (x[i]<y[j])
{
z[(*k)]=x[i];
i++;
(*k)++;
}
else
{
z[(*k)]=y[j];
j++;
(*k)++;
}
}
if (i<m)
for( int l=i;l<m;l++)
{
z[(*k)]=x[l];
(*k)++;
}
else
for (int p=j;p<n;p++)
{
z[*k]=y[p];
(*k)++;
}
}
+
Sortare prin interclasare Merge sort
+
Sortare prin interclasare Merge sort
Algoritm:
se mparte vectorul n secvene din ce in ce mai mici, astfel
nct fiecare secven sa fie ordonat la un moment dat i
interclasat cu o alt secven din vector corespunztoare.
+
Sortare prin interclasare Merge sort
34
34
34
34
25
25
25
41
84
41
34
41
41
25
34
6
41
25
25
78
41
9
25
34
41
84
84
84
9
78
78
78
78
84
84
78
78
84
+
Sortare prin interclasare Merge sort
#include<stdio.h>
void interclasare(int x[10],int p, int m, int u)
{int i,j,k,l;int z[10];
i=p; j=m+1; k=0;
while((i<=m)&&(j<=u))
if (x[i]<x[j])
{z[k]=x[i]; i++; k++;
}
else
{z[k]=x[j]; j++; k++;
}
if (i<=m)
for( int l=i;l<=m;l++)
{ z[k]=x[l];
k++;
}
if (j<=u)
for (int l=j;l<=u;l++)
{ z[k]=x[l];
k++;
}
int t=p;
for (k=0;k<(u-p)+1;k++)
x[t++]=z[k];
}
+
Sortare prin interclasare Merge sort
void divimp(int x[10],int p,int u)
{
if (p<u)
{
int m=(p+u)/2;
divimp(x,p,m);
divimp(x,m+1,u);
interclasare(x,p,m,u);
}
}
void main()
{
int n,m,i,j,k;
int x[10];
printf("n=");
scanf("%d", &n);
for(i=0; i<n;i++)
{printf("x[%d]=",i+1);
scanf("%d",&x[i]);
}
divimp(x,0,n-1);
printf("\nvect rez. este \n");
for(i=0;i<n;i++)
printf("x[%d]=%d\n",i,x[i]);
}
+
Sortarea rapid
Algoritmului:
+
Sortarea rapid
Exemplu
+
Sortarea rapid
Nesortat
4
+
Sortarea rapid
Valoarea pivot = mijloc=3; i=0; j=5
4
+
Sortarea rapid
v[0]>mijloc i nu crete (i=0)
v[6]>mijloc j scade (j=5)
i<=j
V[0]>mijloc>v[5] interschimbm 4 cu 2
+
Sortarea rapid
v[1]>mijloc i nu crete (i=1)
v[4]>mijloc j scade (j=3)
i<=j
v[1]>mijloc>=v[3] interschimbm 6 cu 3
+
Sortarea rapid
v[2]<mijloc i crete (i=3), v[2]<mijloc j nu scade (j=2)
i nu este mai mic dect j (3>2)
i>j se oprete partiionarea
2
+
Sortarea rapid
Vector sortat
1
+
Sortarea rapid
void quicksort(int v[100], int stanga, int dreapta)
{
int i, j, mijloc, aux;
i=stanga;
j=dreapta;
mijloc=v[(stanga+dreapta)/2];
while(i<=j)
{
while(v[i]<mijloc)
i=i+1;
while(v[j]>mijloc)
j=j-1;
if(i<=j)
{
aux=v[i]; v[i]=v[j]; v[j]=aux;
i=i+1; j=j-1;
}
}
if(stanga<j)
quicksort(v, stanga, j);
if(i<dreapta) quicksort(v, i, dreapta);
}
+
Sortarea Shell
n 1959 D.L. Shell a propus un algoritm de ordonare bazat
pe metoda de sortare prin inserie direct.
+
Sortarea Shell
Se consider un ir descresctor de numere naturale, numite incremeni
dintre care ultimul, incn, este 1:
inc1 > inc2 > > inci > inci+1 > > incn = 1.
v[1], v[incm+1],
v[2], v[incm+2],
v[incm], v[2incm].
+
Sortarea Shell
Fie vectorul:
32 95 16 82 24 66 35 19 75 54 40
Trecem la 35.
ncercm s l deplasm cu 5 poziii spre stnga i vedem c acolo se
afl 95, un numr mai mare.
Ca urmare facem efectiv deplasarea, iar 95 trece n locul lui 35.
Obinem:
32 35 16 82 24 66 95 19 75 54 40
+
Sortarea Shell
void sort_shell(double v[],int l)
{
inc2 =inc1/2 ; inc3 =inc2/2..
int i, j, inc;
double a;
for(inc=l/2;inc>0;inc=inc/2)
for(i=inc; i<l;i++)
for(j=i-inc;(j>=0)&&(v[j]>v[j+inc]);j=j-inc)
{
a=v[j];
v[j]=v[j+inc];
v[j+inc]=a;
}
}
Apel:
int n;
double x[100]
sort_shell(x,n);
+
Sortare prin numrare
+
Sortare prin numrare
v= (8, 1, 3, 15, 5)
Pentru fiecare element v[i] numrm cte elemente sunt mai mici
ca el, aceste numere reinndu-le n vectorul num:
v[num[0]]=temp[0]; v[num[1]]=temp[1]...
+
Sortare prin numrare
void sort_numarare(double v[],int l)
{
int i,j,*num;
double *temp;
temp=(double*)malloc(l*sizeof(double));
num=(int*)malloc(l*sizeof(int));
for(i=0;i<l; i++)
num[i]=0;
for(i=0;i<l; i++)
temp[i]=v[i];
for(i=0;i<l-1;i++)
for(j=i+1;j<l; j++)
if(v[j]<v[i])
num[i]=num[i]+1;
else num[j]=num[j]+1;
for(i=0;i<l;i++)
v[num[i]]=temp[i];
free(temp);
free(num);
}
Apel:
int n;
double x[100];
sort_numarare(x,n);