Browse Source

Arreglos al algoritmo de heapSort

root 2 years ago
parent
commit
8c294f3922
1 changed files with 18 additions and 21 deletions
  1. 18
    21
      sorting.py

+ 18
- 21
sorting.py View File

9
 from random import randint
9
 from random import randint
10
 import time
10
 import time
11
 import utils.qsortUtils as qsortUtils
11
 import utils.qsortUtils as qsortUtils
12
-import math
13
 
12
 
14
 def mergeSort(lista):
13
 def mergeSort(lista):
15
 	#definan el algoritmo de ordenamiento mergesort
14
 	#definan el algoritmo de ordenamiento mergesort
65
 	return lista
64
 	return lista
66
 	# Code was base and taken from GeeksforGeeks
65
 	# Code was base and taken from GeeksforGeeks
67
 
66
 
68
-def MAX_HEAPIFY(lista, index):
67
+def MAX_HEAPIFY(lista, index, largo):
69
 	# funcion para mantener la propiedad lista[PARENT(i)] >= lista[i]
68
 	# funcion para mantener la propiedad lista[PARENT(i)] >= lista[i]
70
 	# para todo nodo excepto la raiz en el heap
69
 	# para todo nodo excepto la raiz en el heap
71
 
70
 
72
-	lefti = 2 * index + 1		# index hijo izquierdo
73
-	righti =  2 * index + 2	# index hijo derecho
71
+	largest = index
74
 
72
 
75
-	largo = len(lista) - 1
73
+	lefti = 2 * index + 1	# index hijo izquierdo
74
+	righti =  2 * index + 2	# index hijo derecho
76
 
75
 
77
 	# Si el hijo izq es mayor que el padre
76
 	# Si el hijo izq es mayor que el padre
78
-	if lefti <= largo and lista[lefti] > lista[index]:
77
+	if lefti < largo and lista[lefti] > lista[largest]:
79
 		largest = lefti
78
 		largest = lefti
80
-	else:
81
-		largest = index
82
 
79
 
83
 	 # Si el hijo derecho es mayor que el padre
80
 	 # Si el hijo derecho es mayor que el padre
84
-	if righti <= largo and lista[righti] > lista[largest]:
81
+	if righti < largo and lista[righti] > lista[largest]:
85
 		largest = righti
82
 		largest = righti
86
 
83
 
87
 	 # Si el index seleccionado no es el del numero mas grande
84
 	 # Si el index seleccionado no es el del numero mas grande
88
 	if largest != index:
85
 	if largest != index:
89
 		# swap de los numeros en los indexes
86
 		# swap de los numeros en los indexes
90
 		lista[index], lista[largest] = lista[largest], lista[index]
87
 		lista[index], lista[largest] = lista[largest], lista[index]
91
-		MAX_HEAPIFY(lista, largest)
88
+		MAX_HEAPIFY(lista, largest, largo)
92
 
89
 
93
-def BUILD_MAX_HEAP(lista):
94
-	largo = len(lista) - 1
95
-	index = math.floor(largo/2)
96
-	while index >= 1:
97
-		MAX_HEAPIFY(lista,index)
98
-		index = index - 1
90
+def BUILD_MAX_HEAP(lista, largo):
91
+	index = largo//2 - 1
92
+	while index > -1:
93
+		MAX_HEAPIFY(lista,index,largo)
94
+		index -= 1
99
 
95
 
100
 def heapSort(lista):
96
 def heapSort(lista):
101
 	#definan el algoritmo de ordenamiento heapsort
97
 	#definan el algoritmo de ordenamiento heapsort
102
-
103
-	BUILD_MAX_HEAP(lista)
104
 	largo = len(lista)
98
 	largo = len(lista)
105
-	while largo >= 2:
99
+
100
+	BUILD_MAX_HEAP(lista, largo)
101
+
102
+	while largo > 0:
106
 		# swap del primer numero y el ultimo
103
 		# swap del primer numero y el ultimo
107
 		lista[0], lista[largo-1] = lista[largo-1], lista[0]
104
 		lista[0], lista[largo-1] = lista[largo-1], lista[0]
108
-		largo = largo - 1
109
-		MAX_HEAPIFY(lista,0)
105
+		largo -= 1
106
+		MAX_HEAPIFY(lista,0,largo)
110
 
107
 
111
 	return lista
108
 	return lista
112
 
109