Professional Documents
Culture Documents
S8. Complexitatea Algoritmilor. Algoritmi de Sortare
S8. Complexitatea Algoritmilor. Algoritmi de Sortare
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;
{ 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)
tj = 1, j = 2, . . . , n
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)=
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];
}
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 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));
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]);
}