Sunteți pe pagina 1din 6

Ministerul Educaţiei al Republicii Moldova

Universitatea Tehnică a Moldovei

RAPORT
Lucrarea de laborator nr.6 la
Structuri de date si algoritmi

A efectuat:
st. gr. RM-201 Grosu Maxim

A verificat:
Stratulat Stefan
Chişinău 2021

Lucrarea de laborator nr.6

Tema: Analiza emperică a algoritmilor de sortare i de căutareș


Scopul lucrării: Ob inerea deprinderilor de analiză emperică a algoritmilorț

Sarcina de lucru: De scris un program in limbajul C pentru analiza emperică a algoritmului


propus (după variantă) care afi area meniului cu următoarele ob iuni:ș ț

1. Tabloul demonstrativ de n elemente (n<=20)


2. Tablou cu valori aleatoare pentru trei numere n1, n2, n3 de elemente mari
(10000<n1<n2=2*n1<n3=2*n2)
3. Tablou sortat crescător
4. Tablou sortat invers (descrescător)
5. Analiza algoritmului func iei standard de sortare ț qsort() sau func iei standard de
căutareț bsearch()

Analiza emperică a algoritmului constă în: determinarea timpului de rulare, numărului de


compărări, numărului de interschimbări (mu ări), compărarea rezultatelor ob inute i aranjate înț
ț ș tabela i formularea concluziilor. ș

Quicksort efectuează sortarea bazându-se pe o strategie divide et impera. Astfel, el împarte lista de sortat în
două subliste mai u or de sortat. șPa ii algoritmului sunt:ș

1. Se alege un element al listei, denumit pivot

2. Se reordonează lista astfel încât toate elementele mai mici decât pivotul să fie plasate înaintea
pivotului i toate elementele mai mari să fie după pivot. După această parti ionare, pivotul se află în ș ț
pozi ia sa finală.ț

3. Se sortează recursiv sublista de elemente mai mici decât pivotul i sublista de elemente mai mari decâtș
pivotul.

O listă de dimensiune 0 sau 1 este considerată sortată.


Codul programului
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

long qsortC(int *a,int n)


{
int i,j,pas,aux;
long nr_i = 0;

for(pas=n/2; pas>0; pas/=2) for(i=pas; i<n; i++) for(j=i-


pas; j>=0 && a[j]>a[j+pas]; j-=pas)
{
aux = a[j];
a[j] = a[j+pas];
a[j+pas] = aux;
nr_i++;
}
return nr_i;
}

long qsortD(int *a,int n)


{
int i,j,pas,aux;
long nr_i = 0;

for(pas=n/2; pas>0; pas/=2) for(i=pas; i<n; i++) for(j=i-


pas; j>=0 && a[j]<a[j+pas]; j-=pas)
{
aux = a[j]; a[j]
= a[j+pas];
a[j+pas] =
aux;
nr_i++;
}
return nr_i;
}

int main()
{
int dimension, m = 1,comand;
float times; int
*vector = NULL;

while(1)
{ while(m)
{ m = 0;
system("cls"); fflush(stdin);
printf("Introduceti marimea vectorului (numarul de elemente) : ");
scanf("%d",&dimension);
vector = (int*)malloc(dimension * sizeof(int)); if(!
vector)
{
printf("\nMemoria nu a fost alocata! Incercati din nou.\a\n");
m = 1;
}
}
system("cls"); fflush(stdin); printf("Meniu
sortare :\n\n"); printf("[ 1 ] In ordine
crescatoare\n"); printf("[ 2 ] In ordine
descrescatoare\n\n"); printf("[ 0 ]
Exit\n\n"); printf("Comand >> ");
scanf("%d",&comand); system("cls");
switch(comand)
{
case 0 : if(vector) free(vector); return 0; break;
case 1 :
do{
system("cls"); fflush(stdin); printf("Ce
sortam??\n"); printf("[ 1 ] Un tablou deja
sortat\n"); printf("[ 2 ] Un tablou
aleatoriu\n"); printf("[ 3 ] Un tablou
sortat invers\n\n"); printf("[ 0 ]
Inapoi?\n\n"); printf("Comand >> ");
scanf("%d",&comand); system("cls");
switch(comand)
{
case 0 : break; case 1 : for(int i=0;
i<dimension; i++)
{
vector[i] = i;
}
times = clock();
printf("Sortarea sa efectuat in %f secunde si sau produs %d schimbari\n",
(clock()-
times)/CLOCKS_PER_SECqsort(vector,dimension));
system("pause"); break; case 2 :
srand(time(NULL));
for(int i=0; i<dimension; i++)
{ vector[i] = rand() % 100;
}
times = clock();
printf("Sortarea sa efectuat in %f secunde si sau produs %d schimbari\n",
(clock()-
times)/CLOCKS_PER_SEC,qsortC(vector,dimen
sion)); system("pause"); break;
case 3 : for(int i=0; i<dimension; i+
+)
{
vector[i] = dimension - i;
}
times = clock();
printf("Sortarea sa efectuat in %f secunde si sau produs %d schimbari\n",
(clock()-times)/CLOCKS_PER_SEC,qsortC(vector,dimension));
system("pause"); break;
default : printf("\aAti introdus o comanda gresita\n"); break;
}
}while(comand);
break;
case 2 :
do{
system("cls"); fflush(stdin); printf("Ce
sortam??\n"); printf("[ 1 ] Un tablou deja
sortat\n"); printf("[ 2 ] Un tablou
aleatoriu\n"); printf("[ 3 ] Un tablou
sortat invers\n\n"); printf("[ 0 ]
Inapoi?\n\n"); printf("Comand >> ");
scanf("%d",&comand); system("cls");
switch(comand)
{
case 0 : break;
case 1 :
for(int i=0; i<dimension; i++)
{
vector[i] = dimension - i;
}
times = clock();
printf("Sortarea sa efectuat in %f secunde si sau produs %d schimbari\n",
(clock()-times)/CLOCKS_PER_SEC,qsortD(vector,dimension));
system("pause"); break; case 2 :
srand(time(NULL)); for(int
i=0; i<dimension; i++)
{ vector[i] = rand() % 100;
}
times = clock();
printf("Sortarea sa efectuat in %f secunde si sau produs %d schimbari\n",
(clock()-times)/CLOCKS_PER_SEC,qsortD(vector,dimension));
system("pause");break; case 3 :
for(int i=0; i<dimension; i++)
{
vector[i] = i;
}
times = clock();
printf("Sortarea sa efectuat in %f secunde si sau produs %d schimbari\n",
(clock()-times)/CLOCKS_PER_SEC,qsortD(vector,dimension));
system("pause");break;
default : printf("\aAti introdus o comanda gresita\n");
break; }
}while(comand); break;

default : printf("\aAti introdus o comanda gresita\n"); break;


}
system("pause");
}
return 0;
}

Concluzii: In urma acestei lucrari de laborator am ajuns la ideia ca shell sort este un
algoritm de sortare bun, insa nui asa de rapid ca qsort. Pentru sirurile deja aranjate se face
0 (zero) mutari, ceia ce ii un rezultat bun pentru viteza efectuarii. Inca un plus pentru
acest algoritm este ca nu necesita memorie adaugatoare fata de qsort.

S-ar putea să vă placă și