4 Commits

Author SHA1 Message Date
  ricardo 56fa185371 Merge remote-tracking branch 'origin/sortingNathalia' into origin/sortingFinal 3 years ago
  Nathalia Alicea 490bebba8c added the merge sort algorithm to sorting.py 3 years ago
  Miguel E Cruz 4fa793f545 Added Heapsort implementation and documentation to sorting.py 3 years ago
  Nathalia Alicea 85d72bd97d Added the merge sort algorithm to sorting.py 3 years ago
1 changed files with 117 additions and 9 deletions
  1. 117
    9
      sorting.py

+ 117
- 9
sorting.py View File

4
 Este programa calcula el promedio de tiempo de ejecución de cuatro algoritmos de ordenamiento
4
 Este programa calcula el promedio de tiempo de ejecución de cuatro algoritmos de ordenamiento
5
 La variable maxValor define el valor maximo de los elementos de la lista
5
 La variable maxValor define el valor maximo de los elementos de la lista
6
 La variable largoLista define el largo de las listas a ordenar
6
 La variable largoLista define el largo de las listas a ordenar
7
-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
8
 Al final se imprimen los promedios de cada algortimo
8
 Al final se imprimen los promedios de cada algortimo
9
 """
9
 """
10
 from random import randint
10
 from random import randint
14
     return lista == sorted(lista)
14
     return lista == sorted(lista)
15
 
15
 
16
 def mergeSort(lista):
16
 def mergeSort(lista):
17
-	#definan el algoritmo de ordenamiento mergesort
18
-	return lista
17
+  if len(lista)>1:
18
+    mitad = len(lista)//2
19
+    izq = lista[:mitad]
20
+    der = lista[mitad:]
21
+
22
+    mergeSort(izq)
23
+    mergeSort(der)
24
+
25
+    idx_izq = 0
26
+    idx_der = 0
27
+
28
+    idx_lista = 0
29
+
30
+    while idx_izq < len(izq) and idx_der < len(der):
31
+      if izq[idx_izq] <= der[idx_der]:
32
+        lista[idx_lista] = izq[idx_izq]
33
+        idx_izq += 1
34
+
35
+      else:
36
+        lista[idx_lista] = der[idx_der]
37
+        idx_der += 1
38
+
39
+      idx_lista += 1
40
+
41
+    while idx_izq < len(izq):
42
+      lista[idx_lista] = izq[idx_izq]
43
+      idx_izq +=1
44
+      idx_lista +=1
45
+
46
+    while idx_der < len(der):
47
+      lista[idx_lista] = der[idx_der]
48
+      idx_der += 1
49
+      idx_lista += 1
50
+  return lista
51
+
52
+"""La siguiente implementación del algoritmo 'Heapsort'
53
+fue implementada por Miguel E. Cruz Molina, siguiendo
54
+el diseño propuesto en el libro 'Introduction to
55
+Algorithms' (2009, 3rd ed.), de Cormen, T. H. et al."""
19
 
56
 
20
 def heapSort(lista):
57
 def heapSort(lista):
21
-	#definan el algoritmo de ordenamiento heapsort
22
-	return lista
58
+  """Esta función toma una lista de números y los ordena
59
+  usando el algoritmo 'heapsort', que repetitivamente
60
+  convierte a los elementos no-ordenados en un montículo
61
+  maximal y sustituye el elemento mayor por el último."""
62
+
63
+  # El algoritmo primero genera un montículo maximal
64
+  #   con los elementos en la lista:
65
+  buildHeap(lista, len(lista) - 1)
66
+
67
+  # Por cada uno de los elementos en la lista,
68
+  for i in range(len(lista) - 1, 0, -1):
69
+
70
+    # Se sustituye el elemento en la raíz del montículo
71
+    #   (el elemento más grande) con el último,
72
+
73
+    print(lista)
74
+    temp = lista[i]
75
+    lista[i] = lista[0]
76
+    lista[0] = temp
77
+    print(lista)
78
+
79
+    # Y se genera un montículo con los elementos
80
+    #   restantes, hasta terminar con la lista ordenada.
81
+
82
+    buildHeap(lista, i)
83
+
84
+  return lista
85
+
86
+def buildHeap(lista, heapsize):
87
+  """Esta función toma a una lista de números y la
88
+  convierte en una representación lineal de un montículo
89
+  maximal, i.e. un árbol binario en el que el contenido
90
+  de todo nodo padre (de índice k) es mayor al de sus
91
+  hijos (de índices 2k + 1 y 2k + 2). Este proceso se
92
+  realiza recursivamente, desde el penúltimo 'nivel'
93
+  del árbol hasta la raíz, usando la función auxiliar
94
+  'maxHeapify()'. """
95
+
96
+  for i in range((heapsize-1)//2, -1, -1):
97
+    maxHeapify(lista, i, heapsize)
98
+
99
+def maxHeapify(lista, k, heapsize):
100
+  """Esta función tiene como propósito garantizar que
101
+  la propiedad maximal de un montículo se conserve,
102
+  intercambiando el valor de un nodo padre por el mayor
103
+  valor de entre sus nodos hijos de ser necesario, y
104
+  aplicando el mismo algoritmo sobre el subárbol de ese
105
+  hijo de forma recursiva. La función recibe tres
106
+  argumentos: la lista que contiene el montículo,
107
+  el índice de la raíz del montículo a considerarse,
108
+  y el límite del montículo mayor, que no necesariamente
109
+  es equivalente al largo de la lista."""
110
+
111
+  # Primero se identifican los índices hipotéticos
112
+  #   de los nodos hijos:
113
+  l = 2 * k + 1; r = 2 * k + 2; max = k
114
+
115
+  # Identificar cuál de los tres nodos tiene el mayor
116
+  #   valor.
117
+
118
+  if l < heapsize and lista[max] < lista[l]: max = l
119
+  if r < heapsize and lista[max] < lista[r]: max = r
120
+
121
+  # Si el nodo padre no es el mayor, intercambiarlo
122
+  #   por el nodo hijo con mayor valor, y llamar la
123
+  #   función de modo recursivo sobre el subárbol de
124
+  #   ese hijo.
125
+
126
+  if max != k:
127
+    temp = lista[k]
128
+    lista[k] = lista[max]
129
+    lista[max] = temp
130
+    maxHeapify(lista, max, heapsize)
23
 
131
 
24
 def quickSort(lista):
132
 def quickSort(lista):
25
 	#definan el algoritmo de ordenamiento quicksort
133
 	#definan el algoritmo de ordenamiento quicksort
61
 
169
 
62
 maxValor=1000 	#define el valor maximo de los elementos de la lista
170
 maxValor=1000 	#define el valor maximo de los elementos de la lista
63
 largoLista=1000 #define el largo de las listas a ordenar
171
 largoLista=1000 #define el largo de las listas a ordenar
64
-veces=100 		#define las veces que se va a hacer el ordenamiento 
172
+veces=100 		#define las veces que se va a hacer el ordenamiento
65
 
173
 
66
 acumulaMerge=0 	#variable para acumular el tiempo de ejecucion del mergesort
174
 acumulaMerge=0 	#variable para acumular el tiempo de ejecucion del mergesort
67
 acumulaHeap=0 	#variable para acumular el tiempo de ejecucion del heapsort
175
 acumulaHeap=0 	#variable para acumular el tiempo de ejecucion del heapsort
80
 	t1 = time.clock() 				#seteamos el tiempo al empezar
188
 	t1 = time.clock() 				#seteamos el tiempo al empezar
81
 	mergeSort(listaMerge) 				#ejecutamos el algoritmo mergeSort
189
 	mergeSort(listaMerge) 				#ejecutamos el algoritmo mergeSort
82
 	acumulaMerge+=time.clock()-t1 	#acumulamos el tiempo de ejecucion
190
 	acumulaMerge+=time.clock()-t1 	#acumulamos el tiempo de ejecucion
83
-	
191
+
84
 	t1 = time.clock()				#seteamos el tiempo al empezar
192
 	t1 = time.clock()				#seteamos el tiempo al empezar
85
 	heapSort(listaHeap)					#ejecutamos el algoritmo heapSort
193
 	heapSort(listaHeap)					#ejecutamos el algoritmo heapSort
86
 	acumulaHeap+=time.clock()-t1 	#acumulamos el tiempo de ejecucion
194
 	acumulaHeap+=time.clock()-t1 	#acumulamos el tiempo de ejecucion
87
-	
195
+
88
 	t1 = time.clock()				#seteamos el tiempo al empezar
196
 	t1 = time.clock()				#seteamos el tiempo al empezar
89
 	quickSort(listaQuick)				#ejecutamos el algoritmo quickSort
197
 	quickSort(listaQuick)				#ejecutamos el algoritmo quickSort
90
 	acumulaQuick+=time.clock()-t1 	#acumulamos el tiempo de ejecucion
198
 	acumulaQuick+=time.clock()-t1 	#acumulamos el tiempo de ejecucion
91
-	
199
+
92
 	t1 = time.clock()				#seteamos el tiempo al empezar
200
 	t1 = time.clock()				#seteamos el tiempo al empezar
93
 	shellSort(listaShell)				#ejecutamos el algoritmo shellSort
201
 	shellSort(listaShell)				#ejecutamos el algoritmo shellSort
94
 	acumulaShell+=time.clock()-t1 	#acumulamos el tiempo de ejecucion
202
 	acumulaShell+=time.clock()-t1 	#acumulamos el tiempo de ejecucion