Insérer dans le code suivant vos algorithmes de tri.
Modifier le .pro
en ajoutant la ligne LIBS += -pthread
Puis faite divers tests en faisant varier les paramètres d’entrée :
- la taille des vecteurs;
- le nombre de vecteurs différents;
- nombre d’itérations par vecteur;
#include <iostream>
#include <vector>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <thread>
#include <cassert>
using namespace std;
typedef vector <vector<double>> CMatrix;
CMatrix Mat;
void selectSort (vector <unsigned> & tab){
//TODO
}
void insertSort (vector <unsigned> & vUint)
{
//TODO
}
void bubbleSort (vector <unsigned> & vUint)
{
//TODO
}
void countingSort (vector <unsigned> & vUint)
{
//TODO
}
void languageSort (vector<unsigned> & VUint)
{
sort (VUint.begin(), VUint.end());
}
void initMat (unsigned NbColumns)
{
Mat.resize(5, vector <double> (NbColumns));
}
//http://stackoverflow.com/questions/2962785/c-using-clock-to-measure-time-in-multi-threaded-programs
void protoGenericSort(void (*mySort) (vector <unsigned> & vUint), const vector <unsigned> & vUint, unsigned NbFois, unsigned PosMat, unsigned VectNum)
{
for (unsigned i (0); i < NbFois; ++i)
{
vector <unsigned> copyVUint (vUint);
struct timespec start, finish;
double elapsed;
clock_gettime(CLOCK_MONOTONIC, &start);
mySort (copyVUint);
clock_gettime(CLOCK_MONOTONIC, &finish);
elapsed = (finish.tv_sec - start.tv_sec);
elapsed += (finish.tv_nsec - start.tv_nsec) / 1000000000.0;
Mat [PosMat][i + NbFois * VectNum] = elapsed;
}
}
void traiterResultats (const unsigned & nbElemAEnlever)
{
for (vector <double> & UneLigne : Mat)
{
//tri
sort (UneLigne.begin(), UneLigne.end());
//suppresion des éléments non significatifs
UneLigne = vector <double> (UneLigne.begin() + nbElemAEnlever / 2, UneLigne.end() - nbElemAEnlever / 2 );
//plus petit temps
double min (UneLigne[0]);
//plus grand temps
double max (UneLigne[UneLigne.size()-1]);
//temps median
double med (UneLigne[UneLigne.size()/2]);
//On assigne les valeurs memorisees aux 3 premières cases
UneLigne[0] = min;
UneLigne[1] = med;
UneLigne [2] = max;
}
//Affichage
cout << setw (20) << "Tri" << setw (10) << "Min" << setw (10) << "Med" << setw (10) << "Max" << endl;
vector<string> VMetode {"Selection", "Insertion", "Bulles", "comptage", "Langage"};
for (unsigned i (0); i < VMetode.size(); ++i)
cout << setw (20) << VMetode[i] << setw (10) << setprecision(6) << Mat[i][0] << setw (10) << setprecision(6) << Mat[i][1] << setw (10) << setprecision(6) << Mat[i][2] << endl;
}
int main(int argc, char *argv[])
{
if (argc != 4)
{
cerr << "boulette !\n utilisation : " << argv [0] << " (1) NbElem par vecteur (2) Nb de vecteurs differents (3) Nb itérations par vecteur" << endl;
return 1;
}
unsigned NbElem (stoul(argv[1]));
unsigned NbVecteurs (stoul(argv[2]));
unsigned NbFois (stoul(argv[3]));
srand (time(NULL));
vector <unsigned> VUInt (NbElem);
initMat (NbFois * NbVecteurs);
for (unsigned i (0); i < NbVecteurs; ++i)
{
for (auto & Val : VUInt)
Val = rand () % (VUInt.size() * 10);
thread th1 (protoGenericSort, selectSort, VUInt, NbFois, 0, i);
thread th2 (protoGenericSort, insertSort, VUInt, NbFois, 1, i);
thread th3 (protoGenericSort, bubbleSort, VUInt, NbFois, 2, i);
thread th4 (protoGenericSort, countingSort, VUInt, NbFois, 3, i);
thread th5 (protoGenericSort, languageSort, VUInt, NbFois, 4, i);
th1.join();
th2.join();
th3.join();
th4.join();
th5.join();
cout << i << "fini" << endl;
}
cout << "Taille des vecteurs : " << NbElem << "\nNb de vecteurs : " << NbVecteurs << "\nNb iterations par vecteur : " << NbFois << endl;
//On traite les résultats en supprimant 10% des éléments
traiterResultats (NbFois * NbVecteurs / 10);
return 0;
}