Documente Academic
Documente Profesional
Documente Cultură
Tema:Metode de sortare
Chişinău, 2020
1
Sarcina laboratorului:
Să se creeze un fişier textual care conţine cel puţin 50 de înregistrări, cu cel puţin 5
câmpuri şi are cel puţin 2 tipuri de date, iar câmpul cheie trebuie să fie unic şi
neordonat.
Să fie realizat un program în C++, în care sunt implementate câteva metode de sortare (cel
puţin două) în tabele neordonate după câmpul cheie din fişierul textual creat anterior.
Pentru fiecare metodă de sortare de analizat complexitatea teoretică şi practică.
Să se afişeze următoarele date:
- Estimarea teoretică a complexităţii;
- Număr de comparaţii;
- Număr de permutări;
- Timpul de execuţie al fiecărui algoritm de sortare.
De descris algoritmul metodelor de căutare pe paşi.
Să se implementeze cîteva metode de sortare și să se efectueze sortarea după cheie din fișierul
textual, iar pentru fiecare metodă de sortare să se efectueze urmatoarele:
- Metoda inserției;
- Metoda selecției;
- Metoda rapida;
- Metoda Shell;
- Metoda Heapsort.
Considerãm elementele A[1]...A[i-1] fiind sortate, inserãm elementul A[i] în locul ce îi revine. Fiind
dat o tabelã A cu N elemente nesortate, parcurgem tabela si le inserãm fiecare element în locul
propriu între celelalte elemente considerate sortate. Pentru fiecare i = 2..N , elementele A[1]…A[i] sunt
sortate prin inserarea lui A[i] între lista elementelor sortate: A[1]…A[i-1]. Elementele aflate în stânga
indexului sunt în ordine sortatã dar nu sunt în pozitia lor finalã. Tabela este sortatã complect când
indexul ajunge la capãtul drept al tabelei.
Sortare rapida:
2
Quicksort este un celebru algoritm de sortare, dezvoltat de C. A. R. Hoare și care, în medie,
efectuează θ(nlog n) comparații pentru a sorta nelemente. În cazul cel mai rău,
efectuează O(n2) comparații. De obicei, în practică, quicksort este mai rapid decât ceilalți algoritmi de
sortare dee complexitate θ(nlog n) deoarece bucla sa interioară are implementări eficiente pe
majoritatea arhitecturilor și, în plus, în majoritatea implementărilor practice se pot lua, la proiectare,
decizii ce ajută la evitarea cazului când complexitatea algoritmului este de O(n2)
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ă.
Listingul programului:
#include<iostream>
#include<fstream>
#include<string>
#include<conio.h>
#include<vector>
#include<iomanip>
#include <ctime>
#include<algorithm>
#include<cmath>
class STUDENT
{ public:
int id;
string nume;
string prenume;
string specialitatea;
int anul_nasterii;
public:
friend int operator < (const STUDENT&, const STUDENT&);
friend int operator > (const STUDENT&, const STUDENT&);
friend int operator < (const STUDENT&, const int&);
friend int operator > (const STUDENT&, const int&);
friend int operator == (const STUDENT&, const int&);
3
};
vector<Type> V;
double inceput;
double sfirsit;
int comparatii;
int interschimbari;
public:
table();
4
void Sort_bule();
void selectSort();
};
//************************************
template<class Type>
table<Type>::table()
{
ifstream file("STUDENT.txt");
if(file.fail())
{
cerr<<"Eroare la deschiderea fisierului!"<<endl;
getch();
exit(1);
}
while(!file.eof())
{
file>>value->id;
file>>value->nume;
file>>value->prenume;
file>>value->specialitatea;
file>>value->anul_nasterii;
this->V.push_back(*value);
}//while
comparatii=0;
interschimbari=0;
file.close();
}
//**********************************************
template<class Type>
void table<Type>::Timp()
{
cout<<"Timpul de cautare este: "<<(double)(sfirsit -
inceput)/(double)CLOCKS_PER_SEC
<< " milisecunde" << endl;
}
//***********************************************
template<class Type>
void table<Type>::print()
{
5
cout<<endl<<setw(50)<<"AFISAREA DATELOR"<<endl;
cout<<setw(5)<<"Id"<<setw(15)<<"nume"<<setw(20)<<"prenume"<<setw(17)<<"specialitat
ea"<<setw(20)<<"anul_nasterii"<<endl<<endl;
for(int i=0;i<this->V.size();i++)
{
cout<<setw(5)<<this->V.at(i).id<<setw(15)
<<this->V.at(i).nume<<setw(17)
<<this->V.at(i).prenume<<setw(17)
<<this->V.at(i).specialitatea<<setw(17)
<<this->V.at(i).anul_nasterii<<endl;
}
cout<<endl<<"Dimensiunea tabelului n= "<<V.size()<<endl;
}
//**********************************************
template<class Type>
void table<Type>::swap(int i, int j)
{
Type row;
row=V.at(i);
V.at(i)=V.at(j);
V.at(j)=row;
}
//**********************************************
template<class Type>
void table<Type>::Sort_bule()
{ setInceput();
bool invers;
do
{
invers=false;
for(int i=0;i<V.size()-1;i++)
{ comparatii++;
if(V.at(i).id>V.at(i+1).id)
{
interschimbari++;
swap(i, i+1);
invers=true;
} }
} while(invers);
setSfirsit();
cout<<"Numarul de comparatii: "<<comparatii<<endl;
cout<<"Numarul de interschimbari: "<<interschimbari<<endl;
}
//************************************************
template<class Type>
void table<Type>::insert(int n)
{
for(int i=n-1;i>0;i--)
{ comparatii++;
6
if(V.at(i).id<V.at(i-1).id) { interschimbari++;
swap(i,i-1); }
}
template<class Type>
void table<Type>::insertSort(int n)
{
if(n>1)
{
insertSort(n-1);
insert(n);
}
}
//************************************************
template<class Type>
void table<Type>::selectSort()
{
int i,j,imax;
setInceput();
for(i=V.size()-1;i>0;i--)
{
imax=i;
for(j=0;j<i;j++)
{
if(V.at(j).id > V.at(imax).id) imax=j;
comparatii++;
}
interschimbari++;
swap(i,imax);
}
setSfirsit();
}
//************************************************
template<class Type>
void table<Type>::quicksort(int &stinga, int &dreapta)
{
if(dreapta==V.size() - 1)
{
setInceput();
}
if(stinga < dreapta)
{
Type pivot=V.at(stinga);
int st=stinga - 1;
int dr=dreapta + 1;
while(1)
{
while(V.at(--dr) > pivot)
7
{
++comparatii;
}
while(V.at(++st) < pivot)
{
++comparatii;
}
if(st >= dr) break;
swap(dr, st);
++interschimbari;
}//while
int k=dr+1;
quicksort(stinga,dr);
quicksort(k,dreapta);
}
}
//************************************************
int main() {
table<STUDENT>* unu=new table<STUDENT>();
unu->print();
cout<<"****************************************"<<endl;
cout<<" Sortarea prin metoda bulelor:"<<endl;
unu->Sort_bule();
unu->Timp();
// unu->print();
cout<<"****************************************"<<endl;
cout<<" Sortarea rapida:"<<endl;
table<STUDENT>* doi=new table<STUDENT>();
int j=doi->getSize()-1, k=0;
doi->quicksort(k,j);
doi->setSfirsit();
//doi->print();
//trei->print();
cout<<"Numarul de comparatii: "<<trei->getComp()<<endl;
cout<<"Numarul de interschimbari: "<<trei->getInter()<<endl;
trei->Timp();
cout<<"****************************************"<<endl;
cout<<" Sortarea prin selectie:"<<endl;
table<STUDENT>* patru=new table<STUDENT>();
8
patru->selectSort();
//patru->print();
cout<<"Numarul de comparatii: "<<patru->getComp()<<endl;
cout<<"Numarul de interschimbari: "<<patru->getInter()<<endl;
patru->Timp();
cout<<"****************************************"<<endl;
return 1;
}
Continutul fișierului student.txt
9
Rezultatul:
10
Concluzii
Sortarea reprezintă una dintre cele mai utilizate metode de programare. Sortarea este folosită în
mareamajoritate bazelor de date mari, dar și în secevențe mici de înregistrări. Are utilizări de la
domenii precum matematica (statistica matematica), pînă la limbi (realizarea unor dictionare).
În cadrul acestei lucrări de laborator am analizat 4 algoritmi de sortare : metoda bulelor, metoda
rapidă, prin inserție și prin selecție. Am analizat acești algoritmi din punct de vedere a complexitații și
a duratei timpului necesar execuției. Cel mai lent algoritm din cele 4 este metoda bulelor.
11
i