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,9 +8,10 @@ Al final se imprimen los promedios de cada algortimo
8 8
 """
9 9
 from random import randint
10 10
 import time
11
+import utils.qsortUtils as qsortUtils
11 12
 
12 13
 def mergeSort(lista):
13
-	#definan el algoritmo de ordenamiento mergesort
14
+#definan el algoritmo de ordenamiento mergesort
14 15
 	return lista
15 16
 
16 17
 def heapSort(lista):
@@ -18,8 +19,8 @@ def heapSort(lista):
18 19
 	return lista
19 20
 
20 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 25
 def shellSort(lista):
25 26
 	#definan el algoritmo de ordenamiento shellsort
@@ -32,6 +33,8 @@ veces=100 		#define las veces que se va a hacer el ordenamiento
32 33
 acumulaMerge=0 	#variable para acumular el tiempo de ejecucion del mergesort
33 34
 acumulaHeap=0 	#variable para acumular el tiempo de ejecucion del heapsort
34 35
 acumulaQuick=0 	#variable para acumular el tiempo de ejecucion del quicksort
36
+
37
+
35 38
 acumulaShell=0 	#variable para acumular el tiempo de ejecucion del shellsort
36 39
 
37 40
 for i in range(veces):
@@ -40,26 +43,26 @@ for i in range(veces):
40 43
 	quicklista=list(mergelista)
41 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 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 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 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 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 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

@@ -0,0 +1,26 @@
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
+