7 Commits

Author SHA1 Message Date
  Jantony Velazquez Gauthier 3129ed1a64 Merge branch 'Jantony-shellSort' into sortingFinal 2 years ago
  Jantony Velazquez Gauthier 31a1328cda Merge remote-tracking branch 'origin/Angel-MergeSort' into sortingFinal 2 years ago
  Jantony Velazquez Gauthier 1597a63727 Remove print in quickSort 2 years ago
  Jantony Velazquez Gauthier 71b2da84e8 Add inital shellsort implementation 2 years ago
  Jantony Velazquez Gauthier 115f1e3f22 Make sortingFinal 2 years ago
  AngelRomero5 2aea5dde9f Added Mergesort algorithm 2 years ago
  cynthiarivera15 8967c40964 Quicksort Algorithm 2 years ago
1 changed files with 63 additions and 84 deletions
  1. 63
    84
      sorting.py

+ 63
- 84
sorting.py View File

@@ -8,56 +8,45 @@ Al final se imprimen los promedios de cada algortimo
8 8
 """
9 9
 from random import randint
10 10
 import time
11
-<<<<<<< HEAD
12
-from heapq import heapify, heappush
13
-=======
14
->>>>>>> parent of e630181 (Switch list() to deepcopy() for tests)
11
+from copy import deepcopy
12
+import sys
15 13
 
16
-def mergeSort(lista):
17
-	#definan el algoritmo de ordenamiento mergesort
18
-	return lista
14
+# This function was created to prevent program from stopping before recursion finished
15
+# Changes python's recursion limit
16
+class recursion_depth:
17
+    def __init__(self, limit):
18
+        self.limit = limit
19
+        self.default_limit = sys.getrecursionlimit()
19 20
 
20
-def heapSort(lista):
21
-	#definan el algoritmo de ordenamiento heapsort
22
-	# Dylan A. Cedres Rivera
21
+    def __enter__(self):
22
+        sys.setrecursionlimit(self.limit)
23
+
24
+    def __exit__(self, type, value, traceback):
25
+        sys.setrecursionlimit(self.default_limit)
23 26
 
24
-	"""
25
-	Heapsort se conoce por ser un algoritmo de ordenamiento con las caracteristicas de un arbol binario, 
26
-		en donde cada nodo puede tener un maximo de hasta dos hijos, cumpliendo con las restricciones
27
-		de que el primer nodo debe ser el "nodo padre" (primer elemento en la lista, no puede ser hijo de otro nodo) y
28
-		las "hojas" del arbol binario deben ser solo "nodos hijos" (ultimos elementos de la lista, no pueden ser padres de otros nodos).
27
+# Mergesort algorithm
28
+def mergeSort(lista): # Ángel G. Romero Rosario on 10082022
29 29
 	
30
-	El orden del heapsort puede ser MinHeap (menor a mayor), 
31
-		en donde el nodo padre del arbol binario es el elemento mas pequeno de la lista, 
32
-		o puede ser MaxHeap (mayor a menor), en donde el nodo padre es el elemento mas grande de la lista.
33
-	"""
34
-
35
-	# Nuevo heap para insertar los elementos de lista creada con numeros aleatorios
36
-	myHeap = []
37
-	heapify(myHeap)
38
-
39
-	# Se copian los elementos de lista al heap y se ordenan de menor a mayor los elementos con cada push.
40
-	# Todos los elementos se les asigna un signo contrario al que tienen, para poder crear un MaxHeap, de manera
41
-	# 	que los numeros mas grandes se convierten en los mas pequenos.
42
-	# Si se quiere hacer un MinHeap, la instruccion de multiplicar por -1 no es neceseria 
43
-	for element in lista:
44
-		heappush(myHeap, -1 * element)
45
-
46
-	# print("lista antes de 'heapificar'", lista)
47
-
48
-
49
-	# Este loop se utiliza para crear un MaxHeap, de manera que le devuelve el signo original que tenian los 
50
-	#	elementos antes de que se anadieran al heap.
51
-	# Esto significa que los elementos mas pequenos, se convierten en los mas grandes, dejando la forma de un MaxHeap,
52
-	#	con el numero mas grande quedando como el nodo padre del arbol binario.
53
-	# Si se quiere hacer un MinHeap, este loop no se necesita. 
54
-	for i in range(len(myHeap)):
55
-		myHeap[i] = myHeap[i] * -1
56
-
57
-	# print("lista 'heapificada'", myHeap)
30
+	def merge(l1, l2):
31
+		if len(l1) == 0:
32
+			return l2
33
+		elif len(l2) == 0:
34
+			return l1
35
+		elif l1[0] < l2[0]:
36
+			return l1[0:1] + merge(l1[1:],l2)       # If l1[0] < l2[0] save l1[0] first to the list and call the function again
37
+		else:
38
+			return l2[0:1] + merge(l1, l2[1:])		# If l2[0] < l1[0] save l2[0] first to the list and call the function again
58 39
 	
59
-	# Copia los elementos del heap ordenado de vuelta a la lista inicialmente generada y la devuelve
60
-	lista = myHeap
40
+	if len(lista) <= 1:								# If there are no more items, return lista
41
+		return lista
42
+
43
+	else:
44
+		mid = len(lista) // 2 						# Find the middle in lista and call function to merge lista
45
+		return merge(mergeSort(lista[:mid]), mergeSort(lista[mid:]))
46
+
47
+
48
+def heapSort(lista):
49
+	#definan el algoritmo de ordenamiento heapsort
61 50
 	return lista
62 51
 
63 52
 def quickSort(lista):
@@ -74,7 +63,6 @@ def quickSort(lista):
74 63
           				x = i
75 64
           				del lista[lista.index(i)]
76 65
           				lista.insert(lista.index(p), x)
77
-          				print(lista)
78 66
  
79 67
       			l = quickSort(lista[ :lista.index(p)])
80 68
       			m = quickSort(lista[lista.index(p) + 1:])
@@ -116,48 +104,39 @@ def shellSort(lst):
116 104
 
117 105
     return lst
118 106
 
107
+# timeCode function/thunk -> (duration, return value)
108
+# measures the time it takes for a function/thunk to return
109
+def timeCode(fn):
110
+	t1 = time.perf_counter()
111
+	res = fn()
112
+	duration = time.perf_counter() - t1
113
+	return (duration, res)
119 114
 
120
-maxValor=1000 	#define el valor maximo de los elementos de la lista
121
-largoLista=1000 #define el largo de las listas a ordenar
122
-veces=100 		#define las veces que se va a hacer el ordenamiento 
115
+maxValor = 1000 	#define el valor maximo de los elementos de la lista
116
+largoLista = 1000   #define el largo de las listas a ordenar
117
+veces = 100 		#define las veces que se va a hacer el ordenamiento
123 118
 
124
-acumulaMerge=0 	#variable para acumular el tiempo de ejecucion del mergesort
125
-acumulaHeap=0 	#variable para acumular el tiempo de ejecucion del heapsort
126
-acumulaQuick=0 	#variable para acumular el tiempo de ejecucion del quicksort
127
-acumulaShell=0 	#variable para acumular el tiempo de ejecucion del shellsort
119
+acumulaMerge = 0 	#variable para acumular el tiempo de ejecucion del mergesort
120
+acumulaHeap = 0 	#variable para acumular el tiempo de ejecucion del heapsort
121
+acumulaQuick = 0 	#variable para acumular el tiempo de ejecucion del quicksort
122
+acumulaShell = 0 	#variable para acumular el tiempo de ejecucion del shellsort
128 123
 
129 124
 for i in range(veces):
130 125
 	mergelista = [randint(0,maxValor) for r in range(largoLista)] #creamos una lista con valores al azar
131
-<<<<<<< HEAD
132
-	heaplista=list(mergelista)
133
-	quicklista=list(mergelista)
134
-	searchlista=list(mergelista)
135
-=======
136
-	heaplista = list(mergelista)
137
-	quicklista = list(mergelista)
138
-	searchlista = list(mergelista)
139
->>>>>>> parent of e630181 (Switch list() to deepcopy() for tests)
140
-
141
-	t1 = time.clock() 				#seteamos el tiempo al empezar
142
-	mergeSort(mergelista) 				#ejecutamos el algoritmo mergeSort
143
-	acumulaMerge+=time.clock()-t1 	#acumulamos el tiempo de ejecucion
144
-	
145
-	t1 = time.clock()				#seteamos el tiempo al empezar
146
-	heapSort(heaplista)					#ejecutamos el algoritmo heapSort
147
-	acumulaHeap+=time.clock()-t1 	#acumulamos el tiempo de ejecucion
148
-	
149
-	t1 = time.clock()				#seteamos el tiempo al empezar
150
-	quickSort(quicklista)				#ejecutamos el algoritmo quickSort
151
-	acumulaQuick+=time.clock()-t1 	#acumulamos el tiempo de ejecucion
152
-	
153
-	t1 = time.clock()				#seteamos el tiempo al empezar
154
-	shellSort(searchlista)				#ejecutamos el algoritmo shellSort
155
-	acumulaShell+=time.clock()-t1 	#acumulamos el tiempo de ejecucion
126
+	heaplista = deepcopy(mergelista)
127
+	quicklista = deepcopy(mergelista)
128
+	searchlista = deepcopy(mergelista)
156 129
 
157
-#imprimos los resultados
158
-print( "Promedio de tiempo de ejecucion de "+ str(veces) +" listas de largo " + str(largoLista) )
159
-# print( "MergeSort " + str(acumulaMerge/veces) + " segundos" )
160
-print( "HeapSort " + str(acumulaHeap/veces) + " segundos" )
161
-# print( "QuickSort " + str(acumulaQuick/veces) + " segundos" )
162
-# print( "ShellSort " + str(acumulaShell/veces) + " segundos" )
130
+	with recursion_depth(1500): # This function excedes python's recursion limit
131
+		acumulaMerge += timeCode(lambda: mergeSort(mergelista))[0]
132
+
133
+	acumulaHeap += timeCode(lambda: heapSort(heaplista))[0]
134
+	acumulaQuick += timeCode(lambda: quickSort(quicklista))[0]
135
+	acumulaShell += timeCode(lambda: shellSort(searchlista))[0]
163 136
 
137
+#imprimos los resultados
138
+print(f"Promedio de tiempo de ejecucion de {str(veces)} listas de largo {str(largoLista)}")
139
+print(f"MergeSort {str(acumulaMerge / veces)} segundos")
140
+print(f"HeapSort {str(acumulaHeap / veces)} segundos")
141
+print(f"QuickSort {str(acumulaQuick / veces)} segundos")
142
+print(f"ShellSort {str(acumulaShell / veces)} segundos")