Documente Academic
Documente Profesional
Documente Cultură
RAPORT
Lucrare de laborator Nr.2
la Analiza şi proiectarea algoritmilor
Tema: Metoda divide et impera
Chişinău 2019
▪ Tema: Metoda divide et impera
▪ Scopul lucrării:
▪ Sarcina:
1. Studiaţi noţiunile teoretice despre metoda divide et impera.
2. Implementaţi algoritmii Mergesort şi Quicksort.
3. Efectuaţi analiza empirică a algoritmilor Mergesort şi Quicksort.
4. Faceţi o concluzie asupra lucrării efectuate.
▪ Listingul programului :
#include<iostream>
#include <array>
#include <time.h>
#include <string.h>
#include <ctime>
class Sort{
private:
public :
Sort() {
compCount = 0;
swapCount = 0;
}
//fuziunea
void merge(int a[], int low, int mid, int high, int dim){
int b[dim];
int i = low, j = mid + 1, k = 0;
}
while (i <= mid){
b[k++] = a[i++];
swapCount++;
}
k--;
while (k >= 0) {
a[low + k] = b[k];
swapCount++;
k--;
}
}
do{
while(low < high && a[high] >= pivot){
high--;
compCount++;
}
if(low < high){
a[low] = a[high];
swapCount++;
while(low < high && a[low] <= pivot){
low++;
compCount++;
}
if(low < high) {
a[high] = a[low];
swapCount++;
}
}
} while(low < high);
a[low] = pivot;
swapCount++;
return low;
}
list[index1] = list[index2];
list[index2] = temp;
}
bool isSorted;
}
}
if (isSorted) {
break;
}
}
start = clock();
compCount = 0;
swapCount = 0;
quickSort(b,0,size-1);
end = clock();
sec2 = (float)(end-start)/(CLOCKS_PER_SEC/1000);
cout<<"QuickSort: "<<endl;
cout<<"Number of comparisons: "<<compCount<<endl;;
cout<<"Number of swaps: "<<swapCount<<endl;
cout<<"Running time: "<<sec2<<endl<<endl;
start = clock();
compCount = 0;
swapCount = 0;
superSort(c,size);
end = clock();
sec3 = (float)(end-start)/(CLOCKS_PER_SEC/1000);
cout<<"SuperSort: "<<endl;
cout<<"Number of comparisons: "<<compCount<<endl;;
cout<<"Number of swaps: "<<swapCount<<endl;
cout<<"Running time: "<<sec3<<endl<<endl;
start = clock();
compCount = 0;
swapCount = 0;
quickSort(b,0,size-1);
end = clock();
sec2 = (float)(end-start)/(CLOCKS_PER_SEC/1000);
cout<<"QuickSort: "<<endl;
cout<<"Number of comparisons: "<<compCount<<endl;;
cout<<"Number of swaps: "<<swapCount<<endl;
cout<<"Running time: "<<sec2<<endl<<endl;
start = clock();
compCount = 0;
swapCount = 0;
superSort(c,size);
end = clock();
sec3 = (float)(end-start)/(CLOCKS_PER_SEC/1000);
cout<<"SuperSort: "<<endl;
cout<<"Number of comparisons: "<<compCount<<endl;;
cout<<"Number of swaps: "<<swapCount<<endl;
cout<<"Running time: "<<sec3<<endl<<endl;
memcpy(b,a,sizeof(int)*size);
memcpy(c,a,sizeof(int)*size);
start = clock();
compCount = 0;
swapCount = 0;
mergeSort(a,0,size-1,size);
end = clock();
sec = (float)(end-start)/(CLOCKS_PER_SEC/1000);
cout<<size<<" items sorted"<<endl;
cout<<"MergeSort: "<<endl;
cout<<"Number of comparisons: "<<compCount<<endl;;
cout<<"Number of swaps: "<<swapCount<<endl;
cout<<"Running time: "<<sec<<endl<<endl;
start = clock();
compCount = 0;
swapCount = 0;
quickSort(b,0,size-1);
end = clock();
sec2 = (float)(end-start)/(CLOCKS_PER_SEC/1000);
cout<<"QuickSort: "<<endl;
cout<<"Number of comparisons: "<<compCount<<endl;;
cout<<"Number of swaps: "<<swapCount<<endl;
cout<<"Running time: "<<sec2<<endl<<endl;
start = clock();
compCount = 0;
swapCount = 0;
superSort(c,size);
end = clock();
sec3 = (float)(end-start)/(CLOCKS_PER_SEC/1000);
cout<<"SuperSort: "<<endl;
cout<<"Number of comparisons: "<<compCount<<endl;;
cout<<"Number of swaps: "<<swapCount<<endl;
cout<<"Running time: "<<sec3<<endl<<endl;
}
};
int main(){
Sort sort;
int *tab;
return 0;
}
▪ Analiza rezultatelor:
1. Tabloul arbitrar:
În cazul sortării prin interclasare(MergeSort) vectorii care se interclasează sunt două secvențe
ordonate din același vector. Sortarea prin interclasare utilizează metoda Divide et Impera:
- se împarte vectorul în secvențe din ce în ce mai mici., astfel încît fiecare secventă să fie
ordonată la un moment dat și interclasată cu o altă secventă din vector corespunzătoare.
- practic interclasarea va începe cînd se ajunge la o secvență formată din două elemente.
Aceasta odată ordonată se va interclasa cu o alta corespunzătoare. Cele două secvențe vor alcătui
în subșir ordonat din vector mai mare care la rîndul lui se va interclasa cu subșirul corespunzător.
Avantajele algoritmului:
− Aplicarea algoritmului asupra listelor înlănțuite;
− Perfect pentru sortarea datelor care sunt accesate secvențial;
− Poate fi aplicat asupra fișierelor de orice dimensiune.
Dezavantajele algoritmului:
− În majoritatea implementărilor, dacă lista are dimensiunea N, atunci necesită 2N memorie
pentru a manevra cu sortarea;
− Dacă este folosită recursia, atunci se utilizează de două ori mai multă memorie, în
comparație cu QuickSort.
Quick Sort este unul dintre cei mai rapizi și mai utilizați algoritmi de sortare pînă în acest
moment, bazîndu-se pe tehnica Divide et Impera. Deși cazul cel mai nefavorabil este O(N2), în
practică, QuickSort oferă rezultate mai bune decît restul algoritmilor de sortare din clasa
O(N log N).
Avantajele algoritmului:
− Unul dintre cei mai eficienți algoritmi;
− Nu necesită memorie adițională(sortarea are loc în tablou).
Dezavantajele algoritmului:
− Cazul nefavorabil - O(N2).
Concluzie