Browse Source

Primera implementacion del algoritmo QuickSort y sus funciones auxiliares

root 2 years ago
parent
commit
f30d3b5835

BIN
__pycache__/qsortUtils.cpython-38.pyc View File


+ 19
- 16
sorting.py View File

8
 """
8
 """
9
 from random import randint
9
 from random import randint
10
 import time
10
 import time
11
+import utils.qsortUtils as qsortUtils
11
 
12
 
12
 def mergeSort(lista):
13
 def mergeSort(lista):
13
-	#definan el algoritmo de ordenamiento mergesort
14
+#definan el algoritmo de ordenamiento mergesort
14
 	return lista
15
 	return lista
15
 
16
 
16
 def heapSort(lista):
17
 def heapSort(lista):
18
 	return lista
19
 	return lista
19
 
20
 
20
 def quickSort(lista):
21
 def quickSort(lista):
21
-	#definan el algoritmo de ordenamiento quicksort
22
-	return lista
22
+	 # Se aplica quicksort a la lista desde el primer elemento hasta el último
23
+	return qsortUtils.qSort(lista, 0, len(lista) - 1)
23
 
24
 
24
 def shellSort(lista):
25
 def shellSort(lista):
25
 	#definan el algoritmo de ordenamiento shellsort
26
 	#definan el algoritmo de ordenamiento shellsort
32
 acumulaMerge=0 	#variable para acumular el tiempo de ejecucion del mergesort
33
 acumulaMerge=0 	#variable para acumular el tiempo de ejecucion del mergesort
33
 acumulaHeap=0 	#variable para acumular el tiempo de ejecucion del heapsort
34
 acumulaHeap=0 	#variable para acumular el tiempo de ejecucion del heapsort
34
 acumulaQuick=0 	#variable para acumular el tiempo de ejecucion del quicksort
35
 acumulaQuick=0 	#variable para acumular el tiempo de ejecucion del quicksort
36
+
37
+
35
 acumulaShell=0 	#variable para acumular el tiempo de ejecucion del shellsort
38
 acumulaShell=0 	#variable para acumular el tiempo de ejecucion del shellsort
36
 
39
 
37
 for i in range(veces):
40
 for i in range(veces):
40
 	quicklista=list(mergelista)
43
 	quicklista=list(mergelista)
41
 	searchlista=list(mergelista)
44
 	searchlista=list(mergelista)
42
 
45
 
43
-	t1 = time.clock() 				#seteamos el tiempo al empezar
46
+	t1 = time.perf_counter() 				#seteamos el tiempo al empezar
44
 	mergeSort(mergelista) 				#ejecutamos el algoritmo mergeSort
47
 	mergeSort(mergelista) 				#ejecutamos el algoritmo mergeSort
45
-	acumulaMerge+=time.clock()-t1 	#acumulamos el tiempo de ejecucion
48
+	acumulaMerge+=time.perf_counter()-t1 	#acumulamos el tiempo de ejecucion
46
 	
49
 	
47
-	t1 = time.clock()				#seteamos el tiempo al empezar
50
+	t1 = time.perf_counter()			#seteamos el tiempo al empezar
48
 	heapSort(heaplista)					#ejecutamos el algoritmo heapSort
51
 	heapSort(heaplista)					#ejecutamos el algoritmo heapSort
49
-	acumulaHeap+=time.clock()-t1 	#acumulamos el tiempo de ejecucion
52
+	acumulaHeap+=time.perf_counter()-t1 	#acumulamos el tiempo de ejecucion
50
 	
53
 	
51
-	t1 = time.clock()				#seteamos el tiempo al empezar
54
+	t1 = time.perf_counter()				#seteamos el tiempo al empezar
52
 	quickSort(quicklista)				#ejecutamos el algoritmo quickSort
55
 	quickSort(quicklista)				#ejecutamos el algoritmo quickSort
53
-	acumulaQuick+=time.clock()-t1 	#acumulamos el tiempo de ejecucion
56
+	acumulaQuick+=time.perf_counter()-t1 	#acumulamos el tiempo de ejecucion
54
 	
57
 	
55
-	t1 = time.clock()				#seteamos el tiempo al empezar
58
+	t1 = time.perf_counter()				#seteamos el tiempo al empezar
56
 	shellSort(searchlista)				#ejecutamos el algoritmo shellSort
59
 	shellSort(searchlista)				#ejecutamos el algoritmo shellSort
57
-	acumulaShell+=time.clock()-t1 	#acumulamos el tiempo de ejecucion
60
+	acumulaShell+=time.perf_counter()-t1 	#acumulamos el tiempo de ejecucion
58
 
61
 
59
 #imprimos los resultados
62
 #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"
63
+print (f"Promedio de tiempo de ejecucion de {veces} listas de largo {largoLista}")
64
+print (f"MergeSort {str(acumulaMerge/veces)} segundos")
65
+print (f"HeapSort {str(acumulaHeap/veces)} segundos")
66
+print (f"QuickSort {str(acumulaQuick/veces)} segundos")
67
+print (f"ShellSort {str(acumulaShell/veces) }segundos")
65
 
68
 

BIN
utils/__pycache__/qsortUtils.cpython-38.pyc View File


+ 26
- 0
utils/qsortUtils.py View File

1
+# Función partition: Selecciona el pivote y divide la lista en dos conjuntos: Elementos menores o iguales al pivote y elementos mayores al pivote
2
+
3
+def partition(A, p, r): 
4
+
5
+  x = A[r] # Selección del último elemento en la lista como el pivote
6
+  i = p - 1 # El conjunto de elementos menores o iguales al pivote está inicialmente vacío
7
+
8
+  for j in range (p, r):
9
+
10
+    if A[j] <= x: # Comparación de elemento en la lista con el pivote
11
+      i += 1 # Hacer espacio para el elemento A[j], se coloca un espacio luego del último elemento del conjunto de elementos menores o iguales al pivote.
12
+      A[j], A[i] = A[i], A[j] #Swap A[j] con A[i]
13
+
14
+  A[i+1], A[r] = A[r], A[i+1] # Colocar el pivote como último elemento del conjunto de menores o iguales
15
+
16
+  return i + 1 # Devuelve el índice del pivote actual
17
+
18
+# Función qSort: Aplica el algoritmo de Quicksort a una lista
19
+
20
+def qSort(A, p, r):
21
+
22
+  if p < r: # Caso Base: Se llegó a un elemento individual. La lista es un solo elemento
23
+    q = partition(A, p, r) # Divide/Combine: Particiona la lista y se obtiene el índice del pivote
24
+    qSort(A, p, q - 1) # Conquer: Se aplica qSort al conjunto de elementos menores o iguales al pivote actual
25
+    qSort(A, q + 1, r) # Conquer: Se aplica qSort al conjunto de elementos mayores al pivote actual
26
+