Browse Source

codigo de heapsort anadido

ryanbarreto1 2 years ago
parent
commit
d3ab427cdd
1 changed files with 84 additions and 37 deletions
  1. 84
    37
      sorting.py

+ 84
- 37
sorting.py View File

@@ -8,13 +8,55 @@ Al final se imprimen los promedios de cada algortimo
8 8
 """
9 9
 from random import randint
10 10
 import time
11
+import math
11 12
 
12 13
 def mergeSort(lista):
13 14
 	#definan el algoritmo de ordenamiento mergesort
14 15
 	return lista
15 16
 
17
+def MAX_HEAPIFY(lista, index):
18
+	# funcion para mantener la propiedad lista[PARENT(i)] >= lista[i]
19
+	# para todo nodo excepto la raiz en el heap
20
+
21
+	 lefti = 2 * index + 1		# index hijo izquierdo
22
+	 righti =  2 * index + 2	# index hijo derecho
23
+
24
+	 largo = len(lista) - 1
25
+
26
+	 # Si el hijo izq es mayor que el padre
27
+	 if lefti <= largo and lista[lefti] > lista[index]:
28
+	 	largest = lefti
29
+	 else:
30
+	 	largest = index
31
+
32
+	 # Si el hijo derecho es mayor que el padre
33
+	 if righti <= largo and lista[righti] > lista[largest]:
34
+	 	largest = righti
35
+
36
+	 # Si el index seleccionado no es el del numero mas grande
37
+	 if largest != index:
38
+	 	# swap de los numeros en los indexes
39
+	 	lista[index], lista[largest] = lista[largest], lista[index]
40
+	 	MAX_HEAPIFY(lista, largest)
41
+
42
+def BUILD_MAX_HEAP(lista):
43
+	largo = len(lista) - 1
44
+	index = math.floor(largo/2)
45
+	while index >= 1:
46
+		MAX_HEAPIFY(lista,index)
47
+		index = index - 1
48
+
16 49
 def heapSort(lista):
17 50
 	#definan el algoritmo de ordenamiento heapsort
51
+
52
+	BUILD_MAX_HEAP(lista)
53
+	largo = len(lista)
54
+	while largo >= 2:
55
+		# swap del primer numero y el ultimo
56
+		lista[0], lista[largo-1] = lista[largo-1], lista[0]
57
+		largo = largo - 1
58
+		MAX_HEAPIFY(lista,0)
59
+
18 60
 	return lista
19 61
 
20 62
 def quickSort(lista):
@@ -25,41 +67,46 @@ def shellSort(lista):
25 67
 	#definan el algoritmo de ordenamiento shellsort
26 68
 	return lista
27 69
 
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 
31
-
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
36
-
37
-for i in range(veces):
38
-	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)
42
-
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
58
-
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"
70
+def main():
71
+	maxValor=1000 	#define el valor maximo de los elementos de la lista
72
+	largoLista=1000 #define el largo de las listas a ordenar
73
+	veces=100 		#define las veces que se va a hacer el ordenamiento
74
+
75
+	acumulaMerge=0 	#variable para acumular el tiempo de ejecucion del mergesort
76
+	acumulaHeap=0 	#variable para acumular el tiempo de ejecucion del heapsort
77
+	acumulaQuick=0 	#variable para acumular el tiempo de ejecucion del quicksort
78
+
79
+
80
+	acumulaShell=0 	#variable para acumular el tiempo de ejecucion del shellsort
81
+
82
+	for i in range(veces):
83
+		mergelista = [randint(0,maxValor) for r in range(largoLista)] #creamos una lista con valores al azar
84
+		heaplista=list(mergelista)
85
+		quicklista=list(mergelista)
86
+		searchlista=list(mergelista)
87
+
88
+		t1 = time.perf_counter() 				#seteamos el tiempo al empezar
89
+		mergeSort(mergelista) 				#ejecutamos el algoritmo mergeSort
90
+		acumulaMerge+=time.perf_counter()-t1 	#acumulamos el tiempo de ejecucion
91
+		
92
+		t1 = time.perf_counter()			#seteamos el tiempo al empezar
93
+		heapSort(heaplista)					#ejecutamos el algoritmo heapSort
94
+		acumulaHeap+=time.perf_counter()-t1 	#acumulamos el tiempo de ejecucion
95
+		
96
+		t1 = time.perf_counter()				#seteamos el tiempo al empezar
97
+		quickSort(quicklista)				#ejecutamos el algoritmo quickSort
98
+		acumulaQuick+=time.perf_counter()-t1 	#acumulamos el tiempo de ejecucion
99
+		
100
+		t1 = time.perf_counter()				#seteamos el tiempo al empezar
101
+		shellSort(searchlista)				#ejecutamos el algoritmo shellSort
102
+		acumulaShell+=time.perf_counter()-t1 	#acumulamos el tiempo de ejecucion
103
+
104
+	#imprimos los resultados
105
+	print (f"Promedio de tiempo de ejecucion de {veces} listas de largo {largoLista}")
106
+	print (f"MergeSort {str(acumulaMerge/veces)} segundos")
107
+	print (f"HeapSort {str(acumulaHeap/veces)} segundos")
108
+	print (f"QuickSort {str(acumulaQuick/veces)} segundos")
109
+	print (f"ShellSort {str(acumulaShell/veces) }segundos")
65 110
 
111
+if __name__ == "__main__":
112
+	main()