Documente Academic
Documente Profesional
Documente Cultură
la disciplina
Structuri de Date și Algoritmi
Raport
Lucrare de laborator
la disciplina
Structuri de Date și Algoritmi
Lucrare de laborator nr. 5:
Tema:
Implementarea și analiza algoritmilor de sortare și de căutare în limbajul C.
Scopul lucrării
Scopul lucrării este de a familiariza studentul cu implementarea și analiza algoritmilor,
utilizînd pentru aceasta limbajul C.
Problema
1. Să se elaboreze un program ce va aloca dinamic un tablou unidimensional de
numere întregi și va implementa următoarele funcții, funcțiile vor fi organizate sub
forma unui meniu:
- inițializarea tabloului cu numere aleatorii;
- afișarea tabloului;
- eliberarea memoriei tabloului;
- sortarea tabloului utilizînd una din metode ( selection sort, insertion sort, bubble sort ), se
va afișa în cît timp a fost executată sortarea;
- sortarea tabloului utilizînd una din metode ( merge sort, quick sort, heap sort ), se va afișa
în cît timp a fost executată sortarea.
2.2 Să se realizeze o analiză empirică a timpului necesar pentru a efectua 10000 de căutări
într-un tablou aleator de lungimea N unde N va avea valori [100, 1000, 10000, 100000],
rezultatele obținute se vor plasa în tabelul de mai jos:
N 100 1000 10000 100000
Linear search
Binary search
3.1 Să se realizeze un algoritm de calcul a unui element din șirul lui Fibonaci pe baza
poziției acestuia N, de exemplu:
- fib(0) == 0;
- fib(1) == 1;
- fib(5) == 3;
- fib(100) == 354224848179261915075;
- fib(500) ==
13942322456169788013972438287040728395007025658769730726410896294832557162286
3290691557658876222521294125;
Poziția unui element N, va fi în diapazonul [50;1000000] , asta înseamnă că algoritmul
trebuie să poată calcula minim fib(50) și maxim fib(1000000).
3.2 Să se realizeze o analiză empirică a timpului necesar pentru a calcula numărul lui
fibonaci de pe poziția N, unde N va avea valori [50, 100, 1000, 10000, 100000, 1000000],
rezultatele obținute se vor plasa în tabelul de mai jos:
N 50 100 1000 10000 100000 1000000
Fibonacci
Barem de notare:
Problema 1.1, 1.2 1.1, 1.2, 1.1, 1.2, 1.1, 1.2, Toate Toate
2.1 2.1, 2.2 2.1, 2.2, exercițiile și exercițiile și
3.1, algoritm algoritm
3.2 pentru pentru
fibonaci pînă fibonaci de la
la 1000 1000000
Nota 5 6 7 8 9 10
1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
return (i + 1);
}
int main() {
int size;
printf("Introduceti dimensiunea tabloului: ");
scanf("%d", &size);
int choice;
clock_t start, end;
double cpu_time_used;
while (1) {
printf("\nMeniu:\n");
printf("1. Initializare tablou\n");
printf("2. Afisare tablou\n");
printf("3. Eliberare memorie tablou\n");
printf("4. Sortare selection sort\n");
printf("5. Sortare quick sort\n");
printf("6. Iesire\n");
printf("Alegeti optiunea: ");
scanf("%d", &choice);
switch (choice) {
case 1:
initialize(arr, size);
printf("Tabloul a fost initializat cu numere aleatorii.\n");
break;
case 2:
display(arr, size);
break;
case 3:
free_memory(arr);
break;
case 4:
start = clock();
selection_sort(arr, size);
end = clock();
cpu_time_used = ((double)(end - start)) / CLOCKS_PER_SEC;
printf("Timpul de executie selection sort: %f secunde\n", cpu_time_used);
break;
case 5:
start = clock();
quick_sort(arr, 0, size - 1);
end = clock();
cpu_time_used = ((double)(end - start)) / CLOCKS_PER_SEC;
printf("Timpul de executie quick sort: %f secunde\n", cpu_time_used);
break;
case 6:
exit(0);
default:
printf("Optiune invalida!\n");
}} return 0; }
1.2
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void selection_sort(int arr[], int n);
void heap_sort(int arr[], int n);
void heapify(int arr[], int n, int i);
void swap(int *a, int *b);
int main() {
int N[] = {100, 1000, 10000, 100000};
int n, i, j;
clock_t start, end;
double time_used;
printf("N\t\t\tSelection Sort\tHeap Sort\n");
for (j = 0; j < 4; j++) {
n = N[j];
int arr1[n], arr2[n];
for (i = 0; i < n; i++) {
arr1[i] = arr2[i] = rand() % (n * 10);
}
start = clock();
selection_sort(arr1, n);
end = clock();
time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
start = clock();
heap_sort(arr2, n);
end = clock();
double time_used2 = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("%d\t\t\t%.5f\t\t%.5f\n", n, time_used, time_used2);}
return 0;
}
void selection_sort(int arr[], int n) {
int i, j, min_idx;
2.1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand(time(NULL));
int size, choice, target, result;
clock_t start, end;
double time_taken;
while (1) {
printf("\nMenu:\n");
printf("1. Initialize array with random numbers\n");
printf("2. Print array\n");
printf("3. Free memory\n");
printf("4. Linear search\n");
printf("5. Binary search\n");
printf("0. Exit\n");
printf("Enter your choice: ");
scanf("%d", &choice);
switch (choice) {
case 1:
initialize(arr, size);
break;
case 2:
print_array(arr, size);
break;
case 3:
free_memory(arr);
break;
case 4:
printf("Enter the number to search: ");
scanf("%d", &target);
start = clock();
result = linear_search(arr, size, target);
end = clock();
time_taken = ((double)(end - start)) / CLOCKS_PER_SEC;
if (result != -1) {
printf("Number found at index %d\n", result);
} else {
printf("Number not found\n");
}
printf("Time taken: %f seconds\n", time_taken);
break;
case 5:
printf("Enter the number to search: ");
scanf("%d", &target);
qsort(arr, size, sizeof(int), compare);
start = clock();
result = binary_search(arr, size, target);
end = clock();
time_taken = ((double)(end - start)) / CLOCKS_PER_SEC;
if (result != -1) {
printf("Number found at index %d\n", result);
} else {
printf("Number not found\n");
}
printf("Time taken: %f seconds\n", time_taken);
break;
case 0:
free_memory(arr);
exit(0);
default:
printf("Invalid choice\n");
}
}
return 0;
}
2.2
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int N[] = {100, 1000, 10000, 100000};
int num_searches = 10000;
srand(time(NULL));
start = clock();
for (int j = 0; j < num_searches; j++) {
int x = rand() % (n * 2);
linear_search(arr, n, x);
}
end = clock();
linear_time = (double)(end - start) / CLOCKS_PER_SEC;
start = clock();
for (int j = 0; j < num_searches; j++) {
int x = rand() % (n * 2);
binary_search(arr, n, x);
}
end = clock();
binary_time = (double)(end - start)/CLOCKS_PER_SEC;
return 0;
}
3.1
#include <stdio.h>
int main() {
int n;
printf("Al catalea termen in cautam: ");
scanf("%d",&n);
unsigned long long result = fib(n);
printf("Al %d-lea termen Fibonacci este %llu", n, result);
return 0;
}
3.2
#include <stdio.h>
#include <time.h>
int main() {
int n[] = {50, 100, 1000, 10000, 100000, 1000000};
int num_elements = sizeof(n) / sizeof(n[0]);
printf("N\tTimp (ms)\n");
return 0;
}