7 次代码提交

作者 SHA1 备注 提交日期
  Jantony Velazquez Gauthier 3129ed1a64 Merge branch 'Jantony-shellSort' into sortingFinal 1年前
  Jantony Velazquez Gauthier 31a1328cda Merge remote-tracking branch 'origin/Angel-MergeSort' into sortingFinal 1年前
  Jantony Velazquez Gauthier 1597a63727 Remove print in quickSort 1年前
  Jantony Velazquez Gauthier 71b2da84e8 Add inital shellsort implementation 1年前
  Jantony Velazquez Gauthier 115f1e3f22 Make sortingFinal 1年前
  AngelRomero5 2aea5dde9f Added Mergesort algorithm 1年前
  cynthiarivera15 8967c40964 Quicksort Algorithm 1年前
共有 1 个文件被更改,包括 63 次插入84 次删除
  1. 63
    84
      sorting.py

+ 63
- 84
sorting.py 查看文件

@@ -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")