|
@@ -10,8 +10,10 @@ Al final se imprimen los promedios de cada algortimo
|
10
|
10
|
from random import randint
|
11
|
11
|
import time
|
12
|
12
|
|
13
|
|
-#Defini esta funcion de swap para facilitarme este paso del sort.
|
14
|
|
-#Lo pueden usar si quieren.
|
|
13
|
+# Defini esta funcion de swap para facilitarme este paso del sort.
|
|
14
|
+# Lo pueden usar si quieren.
|
|
15
|
+
|
|
16
|
+
|
15
|
17
|
def swap(lista, posicion1, posicion2):
|
16
|
18
|
tmp = lista[posicion1]
|
17
|
19
|
lista[posicion1] = lista[posicion2]
|
|
@@ -19,190 +21,215 @@ def swap(lista, posicion1, posicion2):
|
19
|
21
|
|
20
|
22
|
|
21
|
23
|
def mergeSort(lista):
|
22
|
|
- #definan el algoritmo de ordenamiento mergesort
|
23
|
|
- if len(lista) > 1:
|
24
|
|
- mid = len(lista)//2
|
25
|
|
- left = lista[:mid]
|
26
|
|
- right = lista[mid:]
|
27
|
|
- mergeSort(left)
|
28
|
|
- mergeSort(right)
|
29
|
|
-
|
30
|
|
- i = j = k = 0
|
31
|
|
-
|
32
|
|
- while i < len(left) and j < len(right):
|
33
|
|
- if left[i] < right[j]:
|
34
|
|
- lista[k] = left[i]
|
35
|
|
- i += 1
|
36
|
|
- else:
|
37
|
|
- lista[k] = right[j]
|
38
|
|
- j += 1
|
39
|
|
- k += 1
|
40
|
|
- while i < len(left):
|
41
|
|
- lista[k] = left[i]
|
42
|
|
- i += 1
|
43
|
|
- k += 1
|
44
|
|
- while j < len(right):
|
45
|
|
- lista[k] = right[j]
|
46
|
|
- j += 1
|
47
|
|
- k += 1
|
48
|
|
-
|
49
|
|
- return lista
|
|
24
|
+ # definan el algoritmo de ordenamiento mergesort
|
|
25
|
+ if len(lista) > 1:
|
|
26
|
+ mid = len(lista)//2
|
|
27
|
+ left = lista[:mid]
|
|
28
|
+ right = lista[mid:]
|
|
29
|
+ mergeSort(left)
|
|
30
|
+ mergeSort(right)
|
|
31
|
+
|
|
32
|
+ i = j = k = 0
|
|
33
|
+
|
|
34
|
+ while i < len(left) and j < len(right):
|
|
35
|
+ if left[i] < right[j]:
|
|
36
|
+ lista[k] = left[i]
|
|
37
|
+ i += 1
|
|
38
|
+ else:
|
|
39
|
+ lista[k] = right[j]
|
|
40
|
+ j += 1
|
|
41
|
+ k += 1
|
|
42
|
+ while i < len(left):
|
|
43
|
+ lista[k] = left[i]
|
|
44
|
+ i += 1
|
|
45
|
+ k += 1
|
|
46
|
+ while j < len(right):
|
|
47
|
+ lista[k] = right[j]
|
|
48
|
+ j += 1
|
|
49
|
+ k += 1
|
|
50
|
+
|
|
51
|
+ return lista
|
50
|
52
|
|
51
|
53
|
|
52
|
54
|
# Tomada de: https://www.geeksforgeeks.org/heap-sort/
|
53
|
55
|
# To heapify subtree rooted at index i.
|
54
|
|
-# n is size of heap
|
|
56
|
+# n is size of heap
|
55
|
57
|
def heapify(arr, n, i):
|
56
|
58
|
largest = i # Initialize largest as root
|
57
|
59
|
l = 2 * i + 1 # left = 2*i + 1
|
58
|
60
|
r = 2 * i + 2 # right = 2*i + 2
|
59
|
|
-
|
|
61
|
+
|
60
|
62
|
# See if left child of root exists and is
|
61
|
63
|
# greater than root
|
62
|
64
|
if l < n and arr[largest] < arr[l]:
|
63
|
65
|
largest = l
|
64
|
|
-
|
|
66
|
+
|
65
|
67
|
# See if right child of root exists and is
|
66
|
68
|
# greater than root
|
67
|
69
|
if r < n and arr[largest] < arr[r]:
|
68
|
70
|
largest = r
|
69
|
|
-
|
|
71
|
+
|
70
|
72
|
# Change root, if needed
|
71
|
73
|
if largest != i:
|
72
|
74
|
arr[i], arr[largest] = arr[largest], arr[i] # swap
|
73
|
|
-
|
|
75
|
+
|
74
|
76
|
# Heapify the root.
|
75
|
77
|
heapify(arr, n, largest)
|
76
|
78
|
|
77
|
79
|
# Tomada de: https://www.geeksforgeeks.org/heap-sort/
|
78
|
|
-def heapSort(lista):
|
79
|
|
- #definan el algoritmo de ordenamiento heapsort
|
80
|
|
- n = len(lista)
|
81
|
|
-
|
82
|
|
- # Build a maxheap.
|
83
|
|
- for i in range(n//2 - 1, -1, -1):
|
84
|
|
- heapify(lista, n, i)
|
85
|
|
-
|
86
|
|
- # One by one extract elements
|
87
|
|
- for i in range(n-1, 0, -1):
|
88
|
|
- lista[i], lista[0] = lista[0], lista[i] # swap
|
89
|
|
- heapify(lista, i, 0)
|
90
|
|
-
|
91
|
|
- return lista
|
92
|
80
|
|
93
|
81
|
|
94
|
|
-def quickSort(lista):
|
95
|
|
- #definan el algoritmo de ordenamiento quicksort
|
96
|
|
- return lista
|
97
|
|
-
|
|
82
|
+def heapSort(lista):
|
|
83
|
+ # definan el algoritmo de ordenamiento heapsort
|
|
84
|
+ n = len(lista)
|
98
|
85
|
|
99
|
|
-def shellSort(lista):
|
100
|
|
- #definan el algoritmo de ordenamiento shellsort
|
101
|
|
-
|
102
|
|
- #Variable para saber cuando el sort termina
|
103
|
|
- termine = False
|
104
|
|
- #Variable para el tamaño de la lista.
|
105
|
|
- n = len(lista)
|
106
|
|
- #Variable para la mitad del tamaño de la lista.
|
107
|
|
- k = int(n/2)
|
108
|
|
- #Variables para realizar las comparaciones de los elementos.
|
109
|
|
- i = 0
|
110
|
|
- j = k
|
111
|
|
-
|
112
|
|
- #Ciclo donde se realiza el ShellSort.
|
113
|
|
- while(termine == False):
|
114
|
|
-
|
115
|
|
- #Comparacion de elementos para ver si se puede hacer un swap.
|
116
|
|
- if(lista[i] > lista[j]):
|
117
|
|
-
|
118
|
|
- swap(lista, i, j)
|
119
|
|
-
|
120
|
|
- #Variables para retener el valor original de x, y para continuar el sort.
|
121
|
|
- tmp1 = i
|
122
|
|
- tmp2 = j
|
123
|
|
-
|
124
|
|
- #Ciclo para realizar swaps en elementos anteriores luego de encontrar un swap.
|
125
|
|
- while True:
|
126
|
|
-
|
127
|
|
- #Verificacion para prevenir que se busquen elementos fuera de la lista.
|
128
|
|
- if((i-k) >= 0):
|
129
|
|
- i = i - k
|
130
|
|
- j = j -k
|
131
|
|
- else:
|
132
|
|
- i = tmp1
|
133
|
|
- j = tmp2
|
134
|
|
- break
|
135
|
|
-
|
136
|
|
- #Verificacion si se puede hacer otro swap.
|
137
|
|
- if(lista[i] > lista[j]):
|
138
|
|
- swap(lista, i , j)
|
139
|
|
- else:
|
140
|
|
- i = tmp1
|
141
|
|
- j = tmp2
|
142
|
|
- break
|
143
|
|
-
|
144
|
|
- #Estos ajustes se utilizan para continuar verificando elementos
|
145
|
|
- #mas adelantes en la lista.
|
146
|
|
- i = i + 1
|
147
|
|
- j = j + 1
|
|
86
|
+ # Build a maxheap.
|
|
87
|
+ for i in range(n//2 - 1, -1, -1):
|
|
88
|
+ heapify(lista, n, i)
|
148
|
89
|
|
149
|
|
- else:
|
150
|
|
- #Estos ajustes se utilizan para continuar verificando elementos
|
151
|
|
- #mas adelantes en la lista.
|
152
|
|
- i = i + 1
|
153
|
|
- j = j + 1
|
|
90
|
+ # One by one extract elements
|
|
91
|
+ for i in range(n-1, 0, -1):
|
|
92
|
+ lista[i], lista[0] = lista[0], lista[i] # swap
|
|
93
|
+ heapify(lista, i, 0)
|
154
|
94
|
|
|
95
|
+ return lista
|
155
|
96
|
|
156
|
|
- #Verifica antes de salirse de la lista para poder comenzar otra vuelta con k/2.
|
157
|
|
- if(j == n):
|
158
|
|
- k = int(k/2)
|
159
|
|
- i = 0
|
160
|
|
- j = k
|
161
|
97
|
|
162
|
|
- #Identifica cuando el sort se supone que haya terminado.
|
163
|
|
- if(k == 0):
|
164
|
|
- termine = True
|
|
98
|
+def quickSort(lista):
|
|
99
|
+ # definan el algoritmo de ordenamiento quicksort
|
165
|
100
|
|
|
101
|
+ # If lista is empty or has only one element.
|
|
102
|
+ if len(lista) <= 1:
|
166
|
103
|
return lista
|
167
|
104
|
|
|
105
|
+ # Else, set pivot to a random element of the list.
|
|
106
|
+ else:
|
|
107
|
+ pivot = lista[randint(0, len(lista)-1)]
|
|
108
|
+
|
|
109
|
+ # Create three list for the numbers lesser, equal and greater than the pivot.
|
|
110
|
+ lesser = []
|
|
111
|
+ equal = []
|
|
112
|
+ greater = []
|
|
113
|
+
|
|
114
|
+ # Iterate through the list and add the elements to the respective list.
|
|
115
|
+ for i in lista:
|
|
116
|
+ if i < pivot:
|
|
117
|
+ lesser.append(i)
|
|
118
|
+ elif i > pivot:
|
|
119
|
+ greater.append(i)
|
|
120
|
+ else:
|
|
121
|
+ equal.append(i)
|
|
122
|
+ # Recursively call quickSort on the two lists and concatenate them with the equal list.
|
|
123
|
+ return quickSort(lesser) + equal + quickSort(greater)
|
168
|
124
|
|
169
|
|
-maxValor=1000 #define el valor maximo de los elementos de la lista
|
170
|
|
-largoLista=1000 #define el largo de las listas a ordenar
|
171
|
|
-veces=100 #define las veces que se va a hacer el ordenamiento
|
172
|
125
|
|
173
|
|
-acumulaMerge=0 #variable para acumular el tiempo de ejecucion del mergesort
|
174
|
|
-acumulaHeap=0 #variable para acumular el tiempo de ejecucion del heapsort
|
175
|
|
-acumulaQuick=0 #variable para acumular el tiempo de ejecucion del quicksort
|
176
|
|
-acumulaShell=0 #variable para acumular el tiempo de ejecucion del shellsort
|
|
126
|
+def shellSort(lista):
|
|
127
|
+ # definan el algoritmo de ordenamiento shellsort
|
|
128
|
+
|
|
129
|
+ # Variable para saber cuando el sort termina
|
|
130
|
+ termine = False
|
|
131
|
+ # Variable para el tamaño de la lista.
|
|
132
|
+ n = len(lista)
|
|
133
|
+ # Variable para la mitad del tamaño de la lista.
|
|
134
|
+ k = int(n/2)
|
|
135
|
+ # Variables para realizar las comparaciones de los elementos.
|
|
136
|
+ i = 0
|
|
137
|
+ j = k
|
|
138
|
+
|
|
139
|
+ # Ciclo donde se realiza el ShellSort.
|
|
140
|
+ while(termine == False):
|
|
141
|
+
|
|
142
|
+ # Comparacion de elementos para ver si se puede hacer un swap.
|
|
143
|
+ if(lista[i] > lista[j]):
|
|
144
|
+
|
|
145
|
+ swap(lista, i, j)
|
|
146
|
+
|
|
147
|
+ # Variables para retener el valor original de x, y para continuar el sort.
|
|
148
|
+ tmp1 = i
|
|
149
|
+ tmp2 = j
|
|
150
|
+
|
|
151
|
+ # Ciclo para realizar swaps en elementos anteriores luego de encontrar un swap.
|
|
152
|
+ while True:
|
|
153
|
+
|
|
154
|
+ # Verificacion para prevenir que se busquen elementos fuera de la lista.
|
|
155
|
+ if((i-k) >= 0):
|
|
156
|
+ i = i - k
|
|
157
|
+ j = j - k
|
|
158
|
+ else:
|
|
159
|
+ i = tmp1
|
|
160
|
+ j = tmp2
|
|
161
|
+ break
|
|
162
|
+
|
|
163
|
+ # Verificacion si se puede hacer otro swap.
|
|
164
|
+ if(lista[i] > lista[j]):
|
|
165
|
+ swap(lista, i, j)
|
|
166
|
+ else:
|
|
167
|
+ i = tmp1
|
|
168
|
+ j = tmp2
|
|
169
|
+ break
|
|
170
|
+
|
|
171
|
+ # Estos ajustes se utilizan para continuar verificando elementos
|
|
172
|
+ # mas adelantes en la lista.
|
|
173
|
+ i = i + 1
|
|
174
|
+ j = j + 1
|
|
175
|
+
|
|
176
|
+ else:
|
|
177
|
+ # Estos ajustes se utilizan para continuar verificando elementos
|
|
178
|
+ # mas adelantes en la lista.
|
|
179
|
+ i = i + 1
|
|
180
|
+ j = j + 1
|
|
181
|
+
|
|
182
|
+ # Verifica antes de salirse de la lista para poder comenzar otra vuelta con k/2.
|
|
183
|
+ if(j == n):
|
|
184
|
+ k = int(k/2)
|
|
185
|
+ i = 0
|
|
186
|
+ j = k
|
|
187
|
+
|
|
188
|
+ # Identifica cuando el sort se supone que haya terminado.
|
|
189
|
+ if(k == 0):
|
|
190
|
+ termine = True
|
|
191
|
+
|
|
192
|
+ return lista
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+maxValor = 1000 # define el valor maximo de los elementos de la lista
|
|
196
|
+largoLista = 1000 # define el largo de las listas a ordenar
|
|
197
|
+veces = 100 # define las veces que se va a hacer el ordenamiento
|
|
198
|
+
|
|
199
|
+acumulaMerge = 0 # variable para acumular el tiempo de ejecucion del mergesort
|
|
200
|
+acumulaHeap = 0 # variable para acumular el tiempo de ejecucion del heapsort
|
|
201
|
+acumulaQuick = 0 # variable para acumular el tiempo de ejecucion del quicksort
|
|
202
|
+acumulaShell = 0 # variable para acumular el tiempo de ejecucion del shellsort
|
177
|
203
|
|
178
|
204
|
for i in range(veces):
|
179
|
|
- lista = [randint(0,maxValor) for r in range(largoLista)] #creamos una lista con valores al azar
|
180
|
|
-
|
181
|
|
- listaMerge = lista[:]
|
182
|
|
- listaHeap = lista[:]
|
183
|
|
- listaQuick = lista[:]
|
184
|
|
- listaShell = lista[:]
|
185
|
|
-
|
186
|
|
- t1 = time.process_time() #seteamos el tiempo al empezar
|
187
|
|
- mergeSort(listaMerge) #ejecutamos el algoritmo mergeSort
|
188
|
|
- acumulaMerge+=time.process_time()-t1 #acumulamos el tiempo de ejecucion
|
189
|
|
-
|
190
|
|
- t1 = time.process_time() #seteamos el tiempo al empezar
|
191
|
|
- heapSort(listaHeap) #ejecutamos el algoritmo heapSort
|
192
|
|
- acumulaHeap+=time.process_time()-t1 #acumulamos el tiempo de ejecucion
|
193
|
|
-
|
194
|
|
- t1 = time.process_time() #seteamos el tiempo al empezar
|
195
|
|
- quickSort(listaQuick) #ejecutamos el algoritmo quickSort
|
196
|
|
- acumulaQuick+=time.process_time()-t1 #acumulamos el tiempo de ejecucion
|
197
|
|
-
|
198
|
|
- t1 = time.process_time() #seteamos el tiempo al empezar
|
199
|
|
- shellSort(listaShell) #ejecutamos el algoritmo shellSort
|
200
|
|
- acumulaShell+=time.process_time()-t1 #acumulamos el tiempo de ejecucion
|
201
|
|
-
|
202
|
|
-#imprimos los resultados
|
203
|
|
-print ("Promedio de tiempo de ejecucion de "+ str(veces) +" listas de largo " + str(largoLista))
|
204
|
|
-print ("MergeSort " + str(acumulaMerge/veces) + " segundos")
|
205
|
|
-print ("HeapSort " + str(acumulaHeap/veces) + " segundos")
|
206
|
|
-print ("QuickSort " + str(acumulaQuick/veces) + " segundos")
|
207
|
|
-print ("ShellSort " + str(acumulaShell/veces) + " segundos")
|
208
|
|
-
|
|
205
|
+ # creamos una lista con valores al azar
|
|
206
|
+ lista = [randint(0, maxValor) for r in range(largoLista)]
|
|
207
|
+
|
|
208
|
+ listaMerge = lista[:]
|
|
209
|
+ listaHeap = lista[:]
|
|
210
|
+ listaQuick = lista[:]
|
|
211
|
+ listaShell = lista[:]
|
|
212
|
+
|
|
213
|
+ t1 = time.process_time() # seteamos el tiempo al empezar
|
|
214
|
+ mergeSort(listaMerge) # ejecutamos el algoritmo mergeSort
|
|
215
|
+ acumulaMerge += time.process_time()-t1 # acumulamos el tiempo de ejecucion
|
|
216
|
+
|
|
217
|
+ t1 = time.process_time() # seteamos el tiempo al empezar
|
|
218
|
+ heapSort(listaHeap) # ejecutamos el algoritmo heapSort
|
|
219
|
+ acumulaHeap += time.process_time()-t1 # acumulamos el tiempo de ejecucion
|
|
220
|
+
|
|
221
|
+ t1 = time.process_time() # seteamos el tiempo al empezar
|
|
222
|
+ quickSort(listaQuick) # ejecutamos el algoritmo quickSort
|
|
223
|
+ acumulaQuick += time.process_time()-t1 # acumulamos el tiempo de ejecucion
|
|
224
|
+
|
|
225
|
+ t1 = time.process_time() # seteamos el tiempo al empezar
|
|
226
|
+ shellSort(listaShell) # ejecutamos el algoritmo shellSort
|
|
227
|
+ acumulaShell += time.process_time()-t1 # acumulamos el tiempo de ejecucion
|
|
228
|
+
|
|
229
|
+# imprimos los resultados
|
|
230
|
+print("Promedio de tiempo de ejecucion de " +
|
|
231
|
+ str(veces) + " listas de largo " + str(largoLista))
|
|
232
|
+print("MergeSort " + str(acumulaMerge/veces) + " segundos")
|
|
233
|
+print("HeapSort " + str(acumulaHeap/veces) + " segundos")
|
|
234
|
+print("QuickSort " + str(acumulaQuick/veces) + " segundos")
|
|
235
|
+print("ShellSort " + str(acumulaShell/veces) + " segundos")
|