Documente Academic
Documente Profesional
Documente Cultură
Cercetării
Universitatea Tehnică a
Moldovei
Facultatea Calculatoare,
Informatică şi Microelectronică
Departamentul Ingineria
Software și Automatică
Mersul lucrării:
Divide et impera este o tehnica de elaborare a algoritmilor care constă în:
1. Descompunerea cazului ce trebuie rezolvat într-un număr de subcazuri mai mici ale aceleiaşi
probleme.
2. Rezolvarea succesivă şi independentă a fiecăruia din aceste subcazuri.
3. Combinarea subsoluţiilor astfel obţinute pentru a găsi soluţia cazului iniţial.
Algoritmul formal al metodei divide et impera:
Insertion Sort
Insertion Sort se bazează pe ideea că un element din elementele de intrare este consumat în fiecare
iterație pentru a-și găsi poziția corectă, adică poziția în care aparține într-o matrice sortată.
Se iterează elementele de intrare prin creșterea matricei sortate la fiecare iterație. Compară
elementul curent cu cea mai mare valoare din matricea sortată. Dacă elementul curent este mai mare,
atunci acesta părăsește elementul în locul său și se deplasează la următorul element, altfel își găsește
poziția corectă în matricea sortată și o deplasează în acea poziție. Aceasta se face prin deplasarea tuturor
elementelor, care sunt mai mari decât elementul curent, în matricea sortată la o poziție în față
Listing Program:
#include <iostream>
#include <ctime>
#include <cstdlib>
//---- MergeSort
int Merge(int *a, int low, int high, int mid)
{
long num;
int i, j, k, temp[high-low+1];
i = low;
k = 0;
j = mid + 1;
//---- QuickSort
int swap(int* a, int* b)
{
long num=0;
int t = *a;
num++;
*a = *b;
num++;
*b = t;
num++;
return num;
}
int partition (int *arr, int low, int high, long num)
{
int pivot = arr[high];
int i = (low - 1);
int i, j, tmp;
long iteration=0;
for (i = 0; i < length; i++) {
j = i;
while (j > 0 && a[j - 1] > a[j]) {
tmp = a[j];
iteration++;
a[j] = a[j - 1];
iteration++;
a[j - 1] = tmp;
iteration++;
j--;
}
}
return iteration;
}
int main()
{
int n=10000;
int *arr= new int[n];
int *favorabil= new int[n];
int *nefavorabil= new int[n];
int number[4]={10,100,1000,10000};
arr=Randomize(n);
favorabil=Favorabil(n);
nefavorabil=NeFavorabil(n);
cout<<endl<<endl<<"QuickSort-Random:"<<endl;
for(int i=0 ; i<4; i++){
long iteration_quick_random=quickSort(arr, 0, number[i]-1);
cout<<"t["<<number[i]<<"]="<<iteration_quick_random<<" ";
}
cout<<endl<<endl<<"\nQuickSort-Nefavorabil:"<<endl;
for(int i=0 ; i<4; i++){
long iteration_quick_favorabil=quickSort(favorabil, 0, number[i]-1);
cout<<"t["<<number[i]<<"]="<<iteration_quick_favorabil<<" ";
}
cout<<endl<<endl<<"\nQuickSort-Favorabil:"<<endl;
for(int i=0 ; i<4; i++){
long iteration_quick_nefavorabil=quickSort(nefavorabil, 0, number[i]-1);
cout<<"t["<<number[i]<<"]="<<iteration_quick_nefavorabil<<" ";
}
arr=Randomize(n);
favorabil=Favorabil(n);
nefavorabil=NeFavorabil(n);
cout<<endl<<endl<<"\nMergeSort-Random:"<<endl;
for(int i=0 ; i<4; i++){
long iteration_merge_random=MergeSort(arr, 0, number[i]-1);
cout<<"t["<<number[i]<<"]="<<iteration_merge_random<<" ";
}
cout<<endl<<endl<<"\nMergeSort-Favorabil:"<<endl;
for(int i=0 ; i<4; i++){
long iteration_merge_favorabil=MergeSort(favorabil, 0, number[i]-1);
cout<<"t["<<number[i]<<"]="<<iteration_merge_favorabil<<" ";
}
cout<<endl<<endl<<"\nMergeSort-Nefavorabil:"<<endl;
for(int i=0 ; i<4; i++){
long iteration_merge_nefavorabil=MergeSort(nefavorabil, 0, number[i]-1);
cout<<"t["<<number[i]<<"]="<<iteration_merge_nefavorabil<<" ";
}
arr=Randomize(n);
favorabil=Favorabil(n);
nefavorabil=NeFavorabil(n);
cout<<endl<<endl<<"\nInsertionSort-Random:"<<endl;
for(int i=0 ; i<4; i++){
long iteration_insert_random=insertionSort(arr, number[i]-1);
cout<<"t["<<number[i]<<"]="<<iteration_insert_random<<" ";
}
cout<<endl<<endl<<"\nInsertionSort-Favorabil:"<<endl;
for(int i=0 ; i<4; i++){
long iteration_insert_favorabil=insertionSort(favorabil, number[i]-1);
cout<<"t["<<number[i]<<"]="<<iteration_insert_favorabil<<" ";
}
cout<<endl<<endl<<"\nInsertion Sort-Nefavorabil:"<<endl;
for(int i=0 ; i<4; i++){
long iteration_insert_nefavorabil=insertionSort(nefavorabil, number[i]-1);
cout<<"t["<<number[i]<<"]="<<iteration_insert_nefavorabil<<" ";
}
return 0;
}
Concluzie:
În cadrul acestei lucrări s-a analizat metoda „Divide et Impera”. S-au implementat modele de
sortare diferite din tehnica Divide et Impera și anume: QuickSort, MergeSort și Insertion Sort. Fiecare
algoritm lucrează dupa principiul lui de sortare, care au fost explicate pe parcursul lucrării de laborator.
Fiecare din acestea au fost adaptate la 3 cazuri: nefavorabil, random și favorabil. Conform datelor
determinate, s-au creat graficile pentru numărul de iterații la un anumit număr de elemente pe care le
sortează algoritmul la fiecare în parte.
În urma rezultatelor obținute, concluzionăm că metoda QuickSort este cea mai eficientă și
reprezintă soluția optimă pentru sortare, folosind un număr minim de iterații.