-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsort_stl.cpp
148 lines (130 loc) · 3.83 KB
/
sort_stl.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/**
* @file sort_stl.cpp
*
* Practicas de PROA
* Practica 2.
*
* @author Ignacio Gomis Lli
* @author Juan Pablo Uriol Balbin
* @date 19/10/2017
* @version 1.0
*/
#include <iostream>
#include <string>
#include <vector>
#include <list>
#include <random>
#include <math.h>
#include <time.h>
#include <algorithm>
using namespace std;
bool RandomVector(vector<int> &, int, int, mt19937 &);
bool RandomList(list<int> &, int, int, mt19937 &);
void modulo(list<int> &, vector<int> &, int, int, mt19937 &);
/**
*
* Funcion Main
* Ejecuta las pruebas variando el tamaño de lista/vector y numero de elementos.
*
*/
int main() {
int UPP1 = 255;
int UPP2 = 65535;
vector<int> vect1(1000);
list<int> lista1(1000);
vector<int> vect2(10000);
list<int> lista2(10000);
vector<int> vect3(100000);
list<int> lista3(100000);
srand(time(NULL));
const int SEED = rand();
std::mt19937 aleatorio(SEED);
modulo(lista1, vect1, 0, UPP1, aleatorio);
modulo(lista1, vect1, 0, UPP2, aleatorio);
modulo(lista2, vect2, 0, UPP1, aleatorio);
modulo(lista2, vect2, 0, UPP2, aleatorio);
modulo(lista3, vect3, 0, UPP1, aleatorio);
modulo(lista3, vect3, 0, UPP2, aleatorio);
return 0;
}
/**
*
* Generara un vector de enteros aleatorios
*
* @param[out] vect Vector de enteros con tamaño asignado
* @param[in] lowlim Limite inferior aleatorio
* @param[in] uplim Limite superior aleatorio
* @return True if lowlim <= uplim False if lowlim>uplim
*/
bool RandomVector(vector<int> & vect, int lowlim, int uplim,
mt19937 & aleatorio) {
if (lowlim <= uplim) {
for (unsigned i = 0; i < vect.size(); i++) {
vect[i] = ((aleatorio() % (uplim - lowlim + 1)) + lowlim);
}
return true;
} else
return false;
}
/**
*
* Generara una lista de enteros aleatorios
*
* @param lista Lista de enteros con tamaño asignado
* @param lowlim Limite inferior aleatorio
* @param uplim Limite superior aleatorio
* @return True if lowlim <= uplim False if lowlim>uplim
*/
bool RandomList(list<int> & lista, int lowlim, int uplim, mt19937 & aleatorio) {
int num;
if (lowlim <= uplim) {
auto iter = lista.begin();
while (iter != lista.end()) {
num = aleatorio() % (uplim - lowlim + 1) + lowlim;
*iter = num;
std::advance(iter, 1);
}
return true;
} else
return false;
}
/**
*
* Calcula el tiempo medio en generar un vector y ordenarlo
*
* @param lista Lista de enteros a ordenar
* @param vect Vector a ordenar
* @param LOW Valor minimo para la generacion aleatoria
* @param UPP Valor maxima para la generacion aleatoria
* @param aleatorio Generador de numeros aleatorios
*/
void modulo(list<int> & lista, vector<int> & vect, int LOW, int UPP, mt19937 & aleatorio)
{
struct timespec ini_time,fin_time;
int veces=100;
double BILLION = 1000000000;
double total;
clock_gettime(CLOCK_REALTIME, &ini_time);
for (int i = 0; i < veces; i++)
{
RandomVector(vect, LOW, UPP, aleatorio);
sort(vect.begin(),vect.end());
}
clock_gettime(CLOCK_REALTIME, &fin_time);
total = (fin_time.tv_sec - ini_time.tv_sec)
+ (fin_time.tv_nsec - ini_time.tv_nsec) / BILLION;
cout << "Tiempo medio STL Vector con "<<vect.size()
<<" elementos y "<<UPP<<" valores: " << total / veces<<endl;
clock_gettime(CLOCK_REALTIME, &ini_time);
for (int i = 0; i < veces; i++)
{
RandomList(lista, LOW, UPP, aleatorio);
lista.sort();
}
clock_gettime(CLOCK_REALTIME, &fin_time);
total = (fin_time.tv_sec - ini_time.tv_sec)
+ (fin_time.tv_nsec - ini_time.tv_nsec) / BILLION;
cout << "Tiempo medio STL Lista con "<<lista.size()
<<" elementos y "<<UPP<<" valores: " << total / veces<<endl;
return;
}