You are on page 1of 7

Complexitatea algoritmilor.

Algoritmi de sortare

1. Complexitatea algoritmilor
- Calcul timp de execuție pentru sortarea prin inserție
2. Algoritmi de sortare
1. Sortarea Shell
2. Sortarea prin interclasare
3. Sortarea rapidă
4. Sortarea prin numărare

1. Complexitatea algoritmilor
- Exemplu - Calcul timp de execuție pentru sortarea prin inserție
Obs:
 Timpul total de execuție este egal cu numărul prelucrărilor elementare executate.
 Termenul dominant este termenul care devine semnificativ mai mare decât ceilalți atunci
când dimensiunea problemei crește (dictează comportarea algoritmului când dimensiunea
problemei crește).
 Ordinul de creștere caracterizează creșterea termenului dominant al timpului de execuție
în raport cu dimensiunea problemei.
Pseudocod:
do-for j=2,n,1

{ aux=x[j];

i=j-1;

while i≥1 and x[i]>aux do

{ x[i+1]=x[i];

i=i-1

}endwhile

X[i+1]=aux

}enddo

1
Operație Cost Nr. repetări Caz favorabil Caz nefavorabil
1 C1 n n n
2 C2 n-1 n-1 n-1
3 C3 n-1 n-1 n-1
4 C4 n n n
n ( n+1 )
∑t j ∑ 1=n-1 ∑ j= 2 −1
j=2 j=2 j=2
5 C5 n
0 n
n ( n−1 )
∑ (t¿ ¿ j ¿−1)¿ ¿ ∑ j= 2
j=2 j=2
6 C6 n
0 n
n ( n−1 )
∑ (t¿ ¿ j ¿−1)¿ ¿ ∑ j= 2
j=2 j=2
7 C7 n-1 n-1 n-1
T(n) (c1+c2+c3+c4+c7)n- ( c4/2 + c5/2 + c6/2 )n2 +
(c2+c3-c4-c7) (c1+c2+c3+ c4/2 − c5/2 −
c6/2 +c7)n−
(c2+c3+c4+c7)

O(n) O(n2)

Cazul cel mai favorabil: tabloul este sortat.

tj = 1, j = 2, . . . , n

T(n) = (c1 + c2 + c3 + c4 + c7)n − (c2 + c3 + c4 + c7)

Cazul cel mai nefavorabil: tabloul este sortat în ordine inversă.

tj = j, j = 2, . . . , n

T(n) = c1n+c2(n-1)+c3(n-1)+c4(n(n+1)/2-1)+c5n(n-1)/2+c6n(n-1)/2+c7(n-1)=

=( c4/2 + c5/2 + c6/2 )n2 +(c1+c2+c3+ c4/2 − c5/2 − c6/2 +c7)n−(c2+c3+c4+c7)

2
2. Algoritmi de sortare
2.1. Sortarea Shell (cu micsorarea incrementului)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void sort_shell(double v[], int l)
{
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;
}
}

void main()
{
int n, i; double v[1000];
printf("n="); scanf("%i", &n);
for (i = 0; i < n; i++)
{
printf("v[%d]=", i);
scanf("%lf", &v[i]);
}
sort_shell(v, n);
printf("Vectorul sortat\n");
for (i = 0; i < n; i++) printf("%8.4lf ", v[i]);
}

3
2.2. Sortarea prin interclasare

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void interclasare(float v[], int ls, int m, int ld)
{
int i, j, k; float v1[100];
for (i = ls, j = m + 1, k = 0; i <= m && j <= ld; k++)
v1[k] = (v[i] < v[j]) ? v[i++] : v[j++];
while (i <= m)v1[k++] = v[i++];
while (j <= ld)v1[k++] = v[j++];
for (i = 0; i < k; i++)v[ls + i] = v1[i]; //for(i=ls;i<=ld;i++) v[i]=v1[i-ls];
}

void sortare(float v[], int ls, int ld)


{
int m;
if (ld - ls > 0)
{
m = (ld + ls) / 2;
sortare(v, ls, m);
sortare(v, m + 1, ld);
interclasare(v, ls, m, ld);
}
}
void main()
{
int n, i; float x[100];
printf("n="); scanf("%d", &n);
for (i = 0; i < n; i++)
{
printf("x[%d]=", i); scanf("%f", &x[i]);
}
sortare(x, 0, n - 1);
for (i = 0; i < n; i++) printf("%3.1f ", x[i]);
}

4
2.3. Sortarea rapida

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int poz(float* x, int p, int u)
{
int i, j, l, di, dj;
float v;
//di, dj: pasii de incrementare pentru i si j; ei indica sensul parcurgerii
i = p; j = u; di = 0; dj = -1;
while (i < j)
if (x[i] > x[j])
{
v = x[i]; x[i] = x[j]; x[j] = v;
l = di; di = -dj; dj = -l;
i += di; j += dj;
}
else
{
i += di; j += dj;
}
return i;
}

void quick(float* x, int p, int u)


{
int i;
if (p < u)
{
i = poz(x, p, u);
quick(x, p, i - 1);
quick(x, i + 1, u);
}
}

void main()
{
int n, i; float v[1000];
printf("Dimensiunea vectorului:"); scanf("%i", &n);
printf("Elementele vectorului\n");
for (i = 0; i < n; i++)
{
printf("v[%d]=", i);
scanf("%f", &v[i]);
}
quick(v, 0, n - 1);
printf("Vectorul sortat\n");
for (i = 0; i < n; i++) printf("%8.4f ", v[i]);
}

5
6
2.4. Sortarea prin numarare

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
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 - 1; i++)
for (j = i + 1; j < l; j++)
if (v[j] < v[i]) num[i]++;
else num[j]++;

for (i = 0; i < l; i++) temp[num[i]] = v[i];

for (i = 0; i < l; i++) v[i] = temp[i];

free(temp); free(num);
}

void main()
{
int n, i; double x[100];
printf("n="); scanf("%d", &n);
for (i = 0; i < n; i++)
{
printf("x[%d]=", i); scanf("%lf", &x[i]);
}
sort_numarare(x, n);
for (i = 0; i < n; i++) printf("%3.1lf ", x[i]);
}

You might also like