4 Ревизии

Автор SHA1 Съобщение Дата
  ricardo 56fa185371 Merge remote-tracking branch 'origin/sortingNathalia' into origin/sortingFinal преди 3 години
  Nathalia Alicea 490bebba8c added the merge sort algorithm to sorting.py преди 3 години
  Miguel E Cruz 4fa793f545 Added Heapsort implementation and documentation to sorting.py преди 3 години
  Nathalia Alicea 85d72bd97d Added the merge sort algorithm to sorting.py преди 3 години
променени са 1 файла, в които са добавени 117 реда и са изтрити 9 реда
  1. 117
    9
      sorting.py

+ 117
- 9
sorting.py Целия файл

@@ -4,7 +4,7 @@ Carlos J Corrada Bravo
4 4
 Este programa calcula el promedio de tiempo de ejecución de cuatro algoritmos de ordenamiento
5 5
 La variable maxValor define el valor maximo de los elementos de la lista
6 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 8
 Al final se imprimen los promedios de cada algortimo
9 9
 """
10 10
 from random import randint
@@ -14,12 +14,120 @@ def isSorted(lista):
14 14
     return lista == sorted(lista)
15 15
 
16 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 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 132
 def quickSort(lista):
25 133
 	#definan el algoritmo de ordenamiento quicksort
@@ -61,7 +169,7 @@ def shellSort(lista):
61 169
 
62 170
 maxValor=1000 	#define el valor maximo de los elementos de la lista
63 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 174
 acumulaMerge=0 	#variable para acumular el tiempo de ejecucion del mergesort
67 175
 acumulaHeap=0 	#variable para acumular el tiempo de ejecucion del heapsort
@@ -80,15 +188,15 @@ for i in range(veces):
80 188
 	t1 = time.clock() 				#seteamos el tiempo al empezar
81 189
 	mergeSort(listaMerge) 				#ejecutamos el algoritmo mergeSort
82 190
 	acumulaMerge+=time.clock()-t1 	#acumulamos el tiempo de ejecucion
83
-	
191
+
84 192
 	t1 = time.clock()				#seteamos el tiempo al empezar
85 193
 	heapSort(listaHeap)					#ejecutamos el algoritmo heapSort
86 194
 	acumulaHeap+=time.clock()-t1 	#acumulamos el tiempo de ejecucion
87
-	
195
+
88 196
 	t1 = time.clock()				#seteamos el tiempo al empezar
89 197
 	quickSort(listaQuick)				#ejecutamos el algoritmo quickSort
90 198
 	acumulaQuick+=time.clock()-t1 	#acumulamos el tiempo de ejecucion
91
-	
199
+
92 200
 	t1 = time.clock()				#seteamos el tiempo al empezar
93 201
 	shellSort(listaShell)				#ejecutamos el algoritmo shellSort
94 202
 	acumulaShell+=time.clock()-t1 	#acumulamos el tiempo de ejecucion