Documente Academic
Documente Profesional
Documente Cultură
RAPORT
la Lucrarea de laborator nr. 2
la disciplina Analiza și Proiectarea Algoritmilor
Chișinău 2019
Scopul lucrării:
1. Studierea metodei divide et impera
2. Analiza și implementarea algoritmilor bazați pe metoda divide et impera
Realizarea sarcinii
Pentru realizarea sarcinii am implementat algoritmii Quick Sort și Merge Sort indicați în lucrare,
precum și un algoritm de sortare la alegere.
2
Reprezentarea grafică a complexității algoritmilor în cazul mediu
3
Merge Sort:
Selection Sort:
4
Listingul Programului:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int A, N;
//------------------------------------
void ascending(int* a,int n){
int i;
for(i=0;i<N;i++){
a[i]=i;
cout<<a[i]<<" ";
}
cout<<endl;}
void descending(int* a, int n){
int i;
for(i=N;i>=0;i--){
a[i]=i;
cout<<a[i]<<" ";
}
cout<<endl;
}
void rand(int* a, int n){
int i;
for(i=0;i<N;i++){
a[i]=rand()%100-23;
cout<<a[i]<<" ";
}
cout<<endl;
}
//-----------------------------------------------
void qsort(int a[],int first,int last)
{
int i, j, pivot, temp;
if(first<last){
pivot=first;
i=first;
5
j=last;
while(i<j) {
while(a[i] <= a[pivot] && i<last)
i++;
while(a[j]>a[pivot])
j--;
if(i<j) {
temp=a[i];
a[i]=a[j];
a[j]=temp;
A++;
}}
temp=a[pivot];
a[pivot]=a[j];
a[j]=temp; A++;
qsort(a,first,j-1);
qsort(a,j+1,last);}
//----------------------------------------------
void swap(int *xp, int *yp)
{
int temp = *xp;
*xp = *yp;
*yp = temp;
}
6
}
//---------------------------------------------------
void merge(int *a, int start, int mid, int end) {
int temp[end - start + 1];
int i = start, j = mid+1, k = 0;
while(i <= mid && j <= end) {
if(a[i] <= a[j]) {
temp[k] = a[i];
k += 1; i += 1;}
else {
temp[k] = a[j];
k += 1; j += 1;}
A++;}
while(i <= mid) {
temp[k] = a[i];
k += 1; i += 1; }
while(j <= end) {
temp[k] = a[j];
k += 1; j += 1; }
for(i = start; i <= end; i += 1) {
a[i] = temp[i - start];
}}
7
}
void stats(){
printf("\n Pasi: %d",A);
printf("\n\n");}
int main()
{
Numere:
cout<<"Introdu nr de elemente\n";
cin>>N;
int a[N],i;
int b[N],c[N],d[N];
int nr_menu;
printf("\n\n");
printf("0. Introdu alt numar de elemente.\n");
printf("1. Quick Sort.\n");
printf("2. Merge Sort.\n");
printf("3. Selection Sort.\n");
printf("\n\n");
Menu:
printf("Alege o optiune: ");
scanf("%d",&nr_menu);
printf("\n");
switch(nr_menu)
{
case 1:
{
for(i=0; i<N; i++){
b[i] = a[i];
c[i] = a[i];
d[i] = a[i];
}
printf("\nQuick Sort:\n\n");
cout<<"Caz favorabil:\n";
ascending(b,N);
qsort(b,0,N-1);
printArray(b, N);
stats();
8
cout<<"Caz mediu:\n";
rand(c,N);
qsort(c,0,N-1);
printArray(c, N);
stats();
cout<<"Caz defavorabil\n";
descending(d,N);
qsort(d,0,N-1);
printArray(d,N);
stats();
A = 0; goto Menu;}
case 2:{
for(i=0;i<N;i++){
b[i]=a[i];
c[i]=a[i];
d[i]=a[i]; }
printf("\nMerge Sort:\n");
cout<<"Caz favorabil:\n";
ascending(b,N);
mergeSort(b, 0, N - 1);
printArray(b, N);
stats();
cout<<"Caz mediu:\n";
rand(c, N);
mergeSort(c, 0, N-1);
printArray(c, N);
stats();
<<"Caz defavorabil:\n";
descending(d,N);
mergeSort(d, 0, N-1);
printArray(d,N);
stats();
A = 0;
Menu; }
case 3:{
for(i=0; i<N; i++){
b[i] = a[i]; c[i] = a[i]; d[i] = a[i];
9
}
printf("\nSelectie:\n");
cout<<"Caz favorabil:\n";
ascending(b,N);
selectionSort(b,N);
printArray(b,N);
stats();
cout<<"Caz mediu:\n";
rand(c,N);
selectionSort(c,N);
printArray(c,N);
stats();
cout<<"Caz defavorabil:\n";
descending(d,N);
selectionSort(d,N);
printArray(d,N);
stats();
A = 0;
goto Menu;}
case 0:{
goto Numere;
break; }
default:{printf("Apasa orice tasta pentru a continua..."); exit(1);}
}
}
Concluzii
În urma efectuării lucrării de laborator am analizat empiric 3 algoritmi diferiți de sortare a unui vector
de n elemente: Quick Sort, Merge Sort și Selection Sort.
Pentru analiza empirică am implementat în limbajul de programare C++ cei 3 algoritmi, și am testat
programul pentru toate cele 3 cazuri: favorabil, când vectorul este deja sortat, defavorabil, când vectorul
este sortat invers, mediu, când este dat un tablou random. Pentru o analiză mai eficientă programul a fost
rulat pentru mai multe valori ale lui n (100, 5000, 1000, 5000). Compararea algoritmilor a fost realizată
după numărul de prelucrări, și anume după numărul de comparări și interschimbare al elementelor
vectorului.
Quick Sort și Selection Sort s-au dovedit a fi cei mai eficienți, pe când eficiența algoritmului Merge
Sort a scăzut considerabil odată cu creșterea numărului de elemente.
10