5 Commits

Auteur SHA1 Bericht Datum
  dylan.cedres 94676a46ad Revert "Added Heapsort algorithm" 1 jaar geleden
  cynthiarivera15 09a7ef7a64 merge Cynthia-Quicksort 1 jaar geleden
  dylan.cedres 7eb6233c87 Merge branch 'sortingFinal' of https://git.ccom.uprrp.edu/CCOM4030/AnCyDyJa into sortingFinal 1 jaar geleden
  Jantony Velazquez Gauthier 34af7910c3 Add shellsort 1 jaar geleden
  cynthiarivera15 8967c40964 Quicksort Algorithm 1 jaar geleden
1 gewijzigde bestanden met toevoegingen van 119 en 80 verwijderingen
  1. 119
    80
      sorting.py

+ 119
- 80
sorting.py Bestand weergeven

@@ -8,98 +8,137 @@ Al final se imprimen los promedios de cada algortimo
8 8
 """
9 9
 from random import randint
10 10
 import time
11
-from heapq import heapify, heappush
11
+from copy import deepcopy
12
+import sys
12 13
 
13
-def mergeSort(lista):
14
-	#definan el algoritmo de ordenamiento mergesort
15
-	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()
16 20
 
17
-def heapSort(lista):
18
-	#definan el algoritmo de ordenamiento heapsort
19
-	# Dylan A. Cedres Rivera
21
+    def __enter__(self):
22
+        sys.setrecursionlimit(self.limit)
20 23
 
21
-	"""
22
-	Heapsort se conoce por ser un algoritmo de ordenamiento con las caracteristicas de un arbol binario, 
23
-		en donde cada nodo puede tener un maximo de hasta dos hijos, cumpliendo con las restricciones
24
-		de que el primer nodo debe ser el "nodo padre" (primer elemento en la lista, no puede ser hijo de otro nodo) y
25
-		las "hojas" del arbol binario deben ser solo "nodos hijos" (ultimos elementos de la lista, no pueden ser padres de otros nodos).
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
26 29
 	
27
-	El orden del heapsort puede ser MinHeap (menor a mayor), 
28
-		en donde el nodo padre del arbol binario es el elemento mas pequeno de la lista, 
29
-		o puede ser MaxHeap (mayor a menor), en donde el nodo padre es el elemento mas grande de la lista.
30
-	"""
31
-
32
-	# Nuevo heap para insertar los elementos de lista creada con numeros aleatorios
33
-	myHeap = []
34
-	heapify(myHeap)
35
-
36
-	# Se copian los elementos de lista al heap y se ordenan de menor a mayor los elementos con cada push.
37
-	# Todos los elementos se les asigna un signo contrario al que tienen, para poder crear un MaxHeap, de manera
38
-	# 	que los numeros mas grandes se convierten en los mas pequenos.
39
-	# Si se quiere hacer un MinHeap, la instruccion de multiplicar por -1 no es neceseria 
40
-	for element in lista:
41
-		heappush(myHeap, -1 * element)
42
-
43
-	# print("lista antes de 'heapificar'", lista)
44
-
45
-
46
-	# Este loop se utiliza para crear un MaxHeap, de manera que le devuelve el signo original que tenian los 
47
-	#	elementos antes de que se anadieran al heap.
48
-	# Esto significa que los elementos mas pequenos, se convierten en los mas grandes, dejando la forma de un MaxHeap,
49
-	#	con el numero mas grande quedando como el nodo padre del arbol binario.
50
-	# Si se quiere hacer un MinHeap, este loop no se necesita. 
51
-	for i in range(len(myHeap)):
52
-		myHeap[i] = myHeap[i] * -1
53
-
54
-	# 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
55 39
 	
56
-	# Copia los elementos del heap ordenado de vuelta a la lista inicialmente generada y la devuelve
57
-	lista = myHeap
58
-	return lista
40
+	if len(lista) <= 1:								# If there are no more items, return lista
41
+		return lista
59 42
 
60
-def quickSort(lista):
61
-	#definan el algoritmo de ordenamiento quicksort
62
-	return lista
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:]))
63 46
 
64
-def shellSort(lista):
65
-	#definan el algoritmo de ordenamiento shellsort
66
-	return lista
67 47
 
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 
48
+def heapSort(lista):
49
+	#definan el algoritmo de ordenamiento heapsort
50
+	return lista
71 51
 
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
52
+def quickSort(lista):
53
+	#definan el algoritmo de ordenamiento quicksort
54
+	if(len(lista) != 0):
55
+    		if(len(lista) == 1):
56
+      			return lista
57
+
58
+    		else:
59
+      			p = lista[0]
60
+
61
+      			for i in lista[1:]:
62
+        			if(p > i):
63
+          				x = i
64
+          				del lista[lista.index(i)]
65
+          				lista.insert(lista.index(p), x)
66
+          				print(lista)
67
+ 
68
+      			l = quickSort(lista[ :lista.index(p)])
69
+      			m = quickSort(lista[lista.index(p) + 1:])
70
+
71
+      			if(m != None and l != None):
72
+        			return l + lista[lista.index(p):lista.index(p) + 1] + m
73
+
74
+      			elif(m == None):
75
+        			return l + lista[lista.index(p):lista.index(p) + 1]
76
+
77
+      			elif(l == None):
78
+        			return lista[lista.index(p):lista.index(p) + 1] + m
79
+
80
+# inplace
81
+# complexity: O(N^2)
82
+def shellSort(lst):
83
+    # initial gap
84
+    gap = len(lst)
85
+
86
+    while 0 < gap:
87
+        # sort every sublist with given gap
88
+        for start in range(gap):
89
+            f = range(start, len(lst), gap)
90
+            s = range(start + gap, len(lst), gap)
91
+
92
+            # bubble sort on sublist
93
+            swapped = True
94
+            while swapped:
95
+                swapped = False
96
+
97
+                # iterate through every adjacent pair in sublist
98
+                for c, n in zip(f, s):
99
+                    if lst[n] < lst[c]:
100
+                        lst[c], lst[n] = lst[n], lst[c]
101
+                        swapped = True
102
+
103
+        # reduce gap towards 0
104
+        gap = gap // 2
105
+
106
+    return lst
107
+
108
+
109
+# timeCode function/thunk -> (duration, return value)
110
+# measures the time it takes for a function/thunk to return
111
+def timeCode(fn):
112
+	t1 = time.perf_counter()
113
+	res = fn()
114
+	duration = time.perf_counter() - t1
115
+	return (duration, res)
116
+
117
+maxValor = 1000 	#define el valor maximo de los elementos de la lista
118
+largoLista = 1000   #define el largo de las listas a ordenar
119
+veces = 100 		#define las veces que se va a hacer el ordenamiento
120
+
121
+acumulaMerge = 0 	#variable para acumular el tiempo de ejecucion del mergesort
122
+acumulaHeap = 0 	#variable para acumular el tiempo de ejecucion del heapsort
123
+acumulaQuick = 0 	#variable para acumular el tiempo de ejecucion del quicksort
124
+acumulaShell = 0 	#variable para acumular el tiempo de ejecucion del shellsort
76 125
 
77 126
 for i in range(veces):
78 127
 	mergelista = [randint(0,maxValor) for r in range(largoLista)] #creamos una lista con valores al azar
79
-	heaplista=list(mergelista)
80
-	quicklista=list(mergelista)
81
-	searchlista=list(mergelista)
128
+	heaplista = deepcopy(mergelista)
129
+	quicklista = deepcopy(mergelista)
130
+	searchlista = deepcopy(mergelista)
82 131
 
83
-	t1 = time.clock() 				#seteamos el tiempo al empezar
84
-	mergeSort(mergelista) 				#ejecutamos el algoritmo mergeSort
85
-	acumulaMerge+=time.clock()-t1 	#acumulamos el tiempo de ejecucion
86
-	
87
-	t1 = time.clock()				#seteamos el tiempo al empezar
88
-	heapSort(heaplista)					#ejecutamos el algoritmo heapSort
89
-	acumulaHeap+=time.clock()-t1 	#acumulamos el tiempo de ejecucion
90
-	
91
-	t1 = time.clock()				#seteamos el tiempo al empezar
92
-	quickSort(quicklista)				#ejecutamos el algoritmo quickSort
93
-	acumulaQuick+=time.clock()-t1 	#acumulamos el tiempo de ejecucion
94
-	
95
-	t1 = time.clock()				#seteamos el tiempo al empezar
96
-	shellSort(searchlista)				#ejecutamos el algoritmo shellSort
97
-	acumulaShell+=time.clock()-t1 	#acumulamos el tiempo de ejecucion
132
+	with recursion_depth(1100): # This function excedes python's recursion limit
133
+		acumulaMerge += timeCode(lambda: mergeSort(mergelista))[0]
98 134
 
99
-#imprimos los resultados
100
-print( "Promedio de tiempo de ejecucion de "+ str(veces) +" listas de largo " + str(largoLista) )
101
-# print( "MergeSort " + str(acumulaMerge/veces) + " segundos" )
102
-print( "HeapSort " + str(acumulaHeap/veces) + " segundos" )
103
-# print( "QuickSort " + str(acumulaQuick/veces) + " segundos" )
104
-# print( "ShellSort " + str(acumulaShell/veces) + " segundos" )
135
+	acumulaHeap += timeCode(lambda: heapSort(heaplista))[0]
136
+	acumulaQuick += timeCode(lambda: quickSort(quicklista))[0]
137
+	acumulaShell += timeCode(lambda: shellSort(searchlista))[0]
105 138
 
139
+#imprimos los resultados
140
+print(f"Promedio de tiempo de ejecucion de {str(veces)} listas de largo {str(largoLista)}")
141
+print(f"MergeSort {str(acumulaMerge / veces)} segundos")
142
+print(f"HeapSort {str(acumulaHeap / veces)} segundos")
143
+print(f"QuickSort {str(acumulaQuick / veces)} segundos")
144
+print(f"ShellSort {str(acumulaShell / veces)} segundos")