Browse Source

Commite merge nuevo

camila.vazquez1 3 years ago
parent
commit
56ceebacaa
1 changed files with 86 additions and 15 deletions
  1. 86
    15
      sorting.py

+ 86
- 15
sorting.py View File

@@ -1,9 +1,10 @@
1
+# -*- coding: utf-8 -*-
1 2
 """
2
-iiiiCarlos J Corrada Bravo
3
+Carlos J Corrada Bravo
3 4
 Este programa calcula el promedio de tiempo de ejecución de cuatro algoritmos de ordenamiento
4 5
 La variable maxValor define el valor maximo de los elementos de la lista
5 6
 La variable largoLista define el largo de las listas a ordenar
6
-La variable veces define las veces que se va a hacer el ordenamiento 
7
+La variable veces define las veces que se va a hacer el ordenamiento
7 8
 Al final se imprimen los promedios de cada algortimo
8 9
 """
9 10
 from random import randint
@@ -44,22 +45,93 @@ def mergeSort(lista):
44 45
                         k += 1
45 46
 
46 47
         return lista
47
-
48 48
 def heapSort(lista):
49 49
 	#definan el algoritmo de ordenamiento heapsort
50
+	"""
51
+	Carlos Hernández
52
+	Implementación de heapSort.
53
+	"""
54
+	def max_heapify(lista, idx, heap_size):
55
+		"""Convertir el nodo `idx` y sus descendientes en un max heap."""
56
+		left_idx = 2 * idx + 1
57
+		right_idx = 2 * idx + 2
58
+		largestval_idx = idx
59
+		if left_idx < heap_size and lista[idx] < lista[left_idx]:
60
+			largestval_idx = left_idx
61
+		if right_idx < heap_size and lista[largestval_idx] < lista[right_idx]:
62
+			largestval_idx = right_idx
63
+		if largestval_idx != idx:
64
+			lista[idx], lista[largestval_idx] = lista[largestval_idx], lista[idx]
65
+			max_heapify(lista, largestval_idx, heap_size)
66
+
67
+	def build_max_heap(lista, heap_size):
68
+		"""Construir un max heap the un heap dado."""
69
+		for idx in range((heap_size - 1) // 2, -1, -1):
70
+			max_heapify(lista, idx, heap_size)
71
+
72
+	heap_size = len(lista)
73
+	build_max_heap(lista, heap_size)
74
+	for idx in range(len(lista) - 1, 0, -1):
75
+		lista[0], lista[idx] = lista[idx], lista[0]
76
+		heap_size -= 1
77
+		max_heapify(lista, 0, heap_size)
50 78
 	return lista
51 79
 
52 80
 def quickSort(lista):
53
-	#definan el algoritmo de ordenamiento quicksort
54
-	return lista
81
+	#Establecemos los arreglos para guardar las particiones
82
+    less = []
83
+    equal = []
84
+    greater = []
85
+
86
+    #Empezamos a iterar el arreglo y ver si los elementos son
87
+    #menores, mayores o iguales que un pivot.
88
+    if len(lista) > 1:
89
+        pivot = lista[0]
90
+        for x in lista:
91
+            if x < pivot:
92
+                less.append(x)
93
+            elif x == pivot:
94
+                equal.append(x)
95
+            elif x > pivot:
96
+                greater.append(x)
97
+
98
+        #Hacemos una llamada recursiva para seguir ordenando
99
+        #las diferentes partes del arreglo. Despues a lo ultimo
100
+        #juntamos todas las partes ordenadas.
101
+        return quickSort(less)+equal+quickSort(greater)
102
+    else:
103
+        return lista
55 104
 
56 105
 def shellSort(lista):
57 106
 	#definan el algoritmo de ordenamiento shellsort
107
+
108
+	#El algoritmo compara elementos de una lista
109
+	#que tienen una distancia fija entre ellos, la
110
+	#differencia en distancia se minimiza por cada
111
+	#iterazion del algoritmo
112
+
113
+	num = int(len(lista))
114
+	dif = int(num/2)
115
+
116
+	while dif > 0:
117
+		for i in range(int(dif),int(num)):
118
+			a = lista[i]
119
+			j = i
120
+
121
+			#por cada intervalo se reorganizara los elementos
122
+			#si se cumple la declaracion dentro del while loop
123
+			while j >= dif and lista[int(j - dif)] > a:
124
+				lista[int(j)] = lista[int(j - dif)]
125
+				j -= dif
126
+
127
+			lista[int(j)] = a
128
+		dif/= 2
129
+
58 130
 	return lista
59 131
 
60 132
 maxValor=1000 	#define el valor maximo de los elementos de la lista
61 133
 largoLista=1000 #define el largo de las listas a ordenar
62
-veces=100 		#define las veces que se va a hacer el ordenamiento 
134
+veces=100 		#define las veces que se va a hacer el ordenamiento
63 135
 
64 136
 acumulaMerge=0 	#variable para acumular el tiempo de ejecucion del mergesort
65 137
 acumulaHeap=0 	#variable para acumular el tiempo de ejecucion del heapsort
@@ -72,23 +144,22 @@ for i in range(veces):
72 144
 	t1 = time.clock() 				#seteamos el tiempo al empezar
73 145
 	mergeSort(lista) 				#ejecutamos el algoritmo mergeSort
74 146
 	acumulaMerge+=time.clock()-t1 	#acumulamos el tiempo de ejecucion
75
-	
147
+
76 148
 	t1 = time.clock()				#seteamos el tiempo al empezar
77 149
 	heapSort(lista)					#ejecutamos el algoritmo heapSort
78 150
 	acumulaHeap+=time.clock()-t1 	#acumulamos el tiempo de ejecucion
79
-	
151
+
80 152
 	t1 = time.clock()				#seteamos el tiempo al empezar
81 153
 	quickSort(lista)				#ejecutamos el algoritmo quickSort
82 154
 	acumulaQuick+=time.clock()-t1 	#acumulamos el tiempo de ejecucion
83
-	
155
+
84 156
 	t1 = time.clock()				#seteamos el tiempo al empezar
85 157
 	shellSort(lista)				#ejecutamos el algoritmo shellSort
86 158
 	acumulaShell+=time.clock()-t1 	#acumulamos el tiempo de ejecucion
87 159
 
88 160
 #imprimos los resultados
89
-print "Promedio de tiempo de ejecucion de "+ str(veces) +" listas de largo " + str(largoLista)
90
-print "MergeSort " + str(acumulaMerge/veces) + " segundos"
91
-print "HeapSort " + str(acumulaHeap/veces) + " segundos"
92
-print "QuickSort " + str(acumulaQuick/veces) + " segundos"
93
-print "ShellSort " + str(acumulaShell/veces) + " segundos"
94
-
161
+print ("Promedio de tiempo de ejecucion de " + str(veces) + " listas de largo " + str(largoLista))
162
+print ("MergeSort " + str(acumulaMerge/veces) + " segundos")
163
+print ("HeapSort " + str(acumulaHeap/veces) + " segundos")
164
+print ("QuickSort " + str(acumulaQuick/veces) + " segundos")
165
+print ("ShellSort " + str(acumulaShell/veces) + " segundos")