4 Commits

Author SHA1 Message Date
  AngelRomero5 955a91ca74 Added merge algorithm 2 years ago
  AngelRomero5 2aea5dde9f Added Mergesort algorithm 2 years ago
  Jantony Velazquez Gauthier e63018137b Switch list() to deepcopy() for tests 2 years ago
  Jantony Velazquez Gauthier 0e94efd6bb Update to python 3 2 years ago
1 changed files with 64 additions and 34 deletions
  1. 64
    34
      sorting.py

+ 64
- 34
sorting.py View File

@@ -8,10 +8,42 @@ Al final se imprimen los promedios de cada algortimo
8 8
 """
9 9
 from random import randint
10 10
 import time
11
+from copy import deepcopy
12
+import sys
13
+
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()
20
+
21
+    def __enter__(self):
22
+        sys.setrecursionlimit(self.limit)
23
+
24
+    def __exit__(self, type, value, traceback):
25
+        sys.setrecursionlimit(self.default_limit)
26
+
27
+# Mergesort algorithm
28
+def mergeSort(lista): # Ángel G. Romero Rosario on 10082022
29
+	
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
39
+	
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:]))
11 46
 
12
-def mergeSort(lista):
13
-	#definan el algoritmo de ordenamiento mergesort
14
-	return lista
15 47
 
16 48
 def heapSort(lista):
17 49
 	#definan el algoritmo de ordenamiento heapsort
@@ -25,41 +57,39 @@ def shellSort(lista):
25 57
 	#definan el algoritmo de ordenamiento shellsort
26 58
 	return lista
27 59
 
28
-maxValor=1000 	#define el valor maximo de los elementos de la lista
29
-largoLista=1000 #define el largo de las listas a ordenar
30
-veces=100 		#define las veces que se va a hacer el ordenamiento 
60
+# timeCode function/thunk -> (duration, return value)
61
+# measures the time it takes for a function/thunk to return
62
+def timeCode(fn):
63
+	t1 = time.perf_counter()
64
+	res = fn()
65
+	duration = time.perf_counter() - t1
66
+	return (duration, res)
67
+
68
+maxValor = 1000 	#define el valor maximo de los elementos de la lista
69
+largoLista = 1000   #define el largo de las listas a ordenar
70
+veces = 100 		#define las veces que se va a hacer el ordenamiento
31 71
 
32
-acumulaMerge=0 	#variable para acumular el tiempo de ejecucion del mergesort
33
-acumulaHeap=0 	#variable para acumular el tiempo de ejecucion del heapsort
34
-acumulaQuick=0 	#variable para acumular el tiempo de ejecucion del quicksort
35
-acumulaShell=0 	#variable para acumular el tiempo de ejecucion del shellsort
72
+acumulaMerge = 0 	#variable para acumular el tiempo de ejecucion del mergesort
73
+acumulaHeap = 0 	#variable para acumular el tiempo de ejecucion del heapsort
74
+acumulaQuick = 0 	#variable para acumular el tiempo de ejecucion del quicksort
75
+acumulaShell = 0 	#variable para acumular el tiempo de ejecucion del shellsort
36 76
 
37 77
 for i in range(veces):
38 78
 	mergelista = [randint(0,maxValor) for r in range(largoLista)] #creamos una lista con valores al azar
39
-	heaplista=list(mergelista)
40
-	quicklista=list(mergelista)
41
-	searchlista=list(mergelista)
79
+	heaplista = deepcopy(mergelista)
80
+	quicklista = deepcopy(mergelista)
81
+	searchlista = deepcopy(mergelista)
42 82
 
43
-	t1 = time.clock() 				#seteamos el tiempo al empezar
44
-	mergeSort(mergelista) 				#ejecutamos el algoritmo mergeSort
45
-	acumulaMerge+=time.clock()-t1 	#acumulamos el tiempo de ejecucion
46
-	
47
-	t1 = time.clock()				#seteamos el tiempo al empezar
48
-	heapSort(heaplista)					#ejecutamos el algoritmo heapSort
49
-	acumulaHeap+=time.clock()-t1 	#acumulamos el tiempo de ejecucion
50
-	
51
-	t1 = time.clock()				#seteamos el tiempo al empezar
52
-	quickSort(quicklista)				#ejecutamos el algoritmo quickSort
53
-	acumulaQuick+=time.clock()-t1 	#acumulamos el tiempo de ejecucion
54
-	
55
-	t1 = time.clock()				#seteamos el tiempo al empezar
56
-	shellSort(searchlista)				#ejecutamos el algoritmo shellSort
57
-	acumulaShell+=time.clock()-t1 	#acumulamos el tiempo de ejecucion
83
+	with recursion_depth(1100): # This function excedes python's recursion limit
84
+		acumulaMerge += timeCode(lambda: mergeSort(mergelista))[0]
58 85
 
59
-#imprimos los resultados
60
-print "Promedio de tiempo de ejecucion de "+ str(veces) +" listas de largo " + str(largoLista)
61
-print "MergeSort " + str(acumulaMerge/veces) + " segundos"
62
-print "HeapSort " + str(acumulaHeap/veces) + " segundos"
63
-print "QuickSort " + str(acumulaQuick/veces) + " segundos"
64
-print "ShellSort " + str(acumulaShell/veces) + " segundos"
86
+	acumulaHeap += timeCode(lambda: heapSort(heaplista))[0]
87
+	acumulaQuick += timeCode(lambda: quickSort(quicklista))[0]
88
+	acumulaShell += timeCode(lambda: shellSort(searchlista))[0]
65 89
 
90
+#imprimos los resultados
91
+print(f"Promedio de tiempo de ejecucion de {str(veces)} listas de largo {str(largoLista)}")
92
+print(f"MergeSort {str(acumulaMerge / veces)} segundos")
93
+print(f"HeapSort {str(acumulaHeap / veces)} segundos")
94
+print(f"QuickSort {str(acumulaQuick / veces)} segundos")
95
+print(f"ShellSort {str(acumulaShell / veces)} segundos")