Browse Source

Make sortingFinal

parent
commit
115f1e3f22
1 changed files with 132 additions and 31 deletions
  1. 132
    31
      sorting.py

+ 132
- 31
sorting.py View File

@@ -8,7 +8,10 @@ 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
11
+<<<<<<< HEAD
12
+from heapq import heapify, heappush
13
+=======
14
+>>>>>>> parent of e630181 (Switch list() to deepcopy() for tests)
12 15
 
13 16
 def mergeSort(lista):
14 17
 	#definan el algoritmo de ordenamiento mergesort
@@ -16,47 +19,145 @@ def mergeSort(lista):
16 19
 
17 20
 def heapSort(lista):
18 21
 	#definan el algoritmo de ordenamiento heapsort
22
+	# Dylan A. Cedres Rivera
23
+
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).
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)
58
+	
59
+	# Copia los elementos del heap ordenado de vuelta a la lista inicialmente generada y la devuelve
60
+	lista = myHeap
19 61
 	return lista
20 62
 
21 63
 def quickSort(lista):
22 64
 	#definan el algoritmo de ordenamiento quicksort
23
-	return lista
65
+	if(len(lista) != 0):
66
+    		if(len(lista) == 1):
67
+      			return lista
24 68
 
25
-def shellSort(lista):
26
-	#definan el algoritmo de ordenamiento shellsort
27
-	return lista
69
+    		else:
70
+      			p = lista[0]
71
+
72
+      			for i in lista[1:]:
73
+        			if(p > i):
74
+          				x = i
75
+          				del lista[lista.index(i)]
76
+          				lista.insert(lista.index(p), x)
77
+          				print(lista)
78
+ 
79
+      			l = quickSort(lista[ :lista.index(p)])
80
+      			m = quickSort(lista[lista.index(p) + 1:])
28 81
 
29
-# timeCode function/thunk -> (duration, return value)
30
-# measures the time it takes for a function/thunk to return
31
-def timeCode(fn):
32
-	t1 = time.perf_counter()
33
-	res = fn()
34
-	duration = time.perf_counter() - t1
35
-	return (duration, res)
82
+      			if(m != None and l != None):
83
+        			return l + lista[lista.index(p):lista.index(p) + 1] + m
36 84
 
37
-maxValor = 1000 	#define el valor maximo de los elementos de la lista
38
-largoLista = 1000 #define el largo de las listas a ordenar
39
-veces = 100 		#define las veces que se va a hacer el ordenamiento
85
+      			elif(m == None):
86
+        			return l + lista[lista.index(p):lista.index(p) + 1]
40 87
 
41
-acumulaMerge = 0 	#variable para acumular el tiempo de ejecucion del mergesort
42
-acumulaHeap = 0 	#variable para acumular el tiempo de ejecucion del heapsort
43
-acumulaQuick = 0 	#variable para acumular el tiempo de ejecucion del quicksort
44
-acumulaShell = 0 	#variable para acumular el tiempo de ejecucion del shellsort
88
+      			elif(l == None):
89
+        			return lista[lista.index(p):lista.index(p) + 1] + m
90
+
91
+# inplace
92
+# complexity: O(N^2)
93
+def shellSort(lst):
94
+    # initial gap
95
+    gap = len(lst)
96
+
97
+    while 0 < gap:
98
+        # sort every sublist with given gap
99
+        for start in range(gap):
100
+            f = range(start, len(lst), gap)
101
+            s = range(start + gap, len(lst), gap)
102
+
103
+            # bubble sort on sublist
104
+            swapped = True
105
+            while swapped:
106
+                swapped = False
107
+
108
+                # iterate through every adjacent pair in sublist
109
+                for c, n in zip(f, s):
110
+                    if lst[n] < lst[c]:
111
+                        lst[c], lst[n] = lst[n], lst[c]
112
+                        swapped = True
113
+
114
+        # reduce gap towards 0
115
+        gap = gap // 2
116
+
117
+    return lst
118
+
119
+
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 
123
+
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
45 128
 
46 129
 for i in range(veces):
47 130
 	mergelista = [randint(0,maxValor) for r in range(largoLista)] #creamos una lista con valores al azar
48
-	heaplista = deepcopy(mergelista)
49
-	quicklista = deepcopy(mergelista)
50
-	searchlista = deepcopy(mergelista)
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)
51 140
 
52
-	acumulaMerge += timeCode(lambda: mergeSort(mergelista))[0]
53
-	acumulaHeap += timeCode(lambda: heapSort(heaplista))[0]
54
-	acumulaQuick += timeCode(lambda: quickSort(quicklista))[0]
55
-	acumulaShell += timeCode(lambda: shellSort(searchlista))[0]
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
56 156
 
57 157
 #imprimos los resultados
58
-print(f"Promedio de tiempo de ejecucion de {str(veces)} listas de largo {str(largoLista)}")
59
-print(f"MergeSort {str(acumulaMerge / veces)} segundos")
60
-print(f"HeapSort {str(acumulaHeap / veces)} segundos")
61
-print(f"QuickSort {str(acumulaQuick / veces)} segundos")
62
-print(f"ShellSort {str(acumulaShell / veces)} segundos")
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" )
163
+