Quellcode durchsuchen

Added quicksort algorithm

eduardo-santin vor 3 Jahren
Ursprung
Commit
1f6ae5720b
1 geänderte Dateien mit 179 neuen und 152 gelöschten Zeilen
  1. 179
    152
      sorting.py

+ 179
- 152
sorting.py Datei anzeigen

@@ -10,8 +10,10 @@ Al final se imprimen los promedios de cada algortimo
10 10
 from random import randint
11 11
 import time
12 12
 
13
-#Defini esta funcion de swap para facilitarme este paso del sort.
14
-#Lo pueden usar si quieren.
13
+# Defini esta funcion de swap para facilitarme este paso del sort.
14
+# Lo pueden usar si quieren.
15
+
16
+
15 17
 def swap(lista, posicion1, posicion2):
16 18
     tmp = lista[posicion1]
17 19
     lista[posicion1] = lista[posicion2]
@@ -19,190 +21,215 @@ def swap(lista, posicion1, posicion2):
19 21
 
20 22
 
21 23
 def mergeSort(lista):
22
-	#definan el algoritmo de ordenamiento mergesort
23
-	if len(lista) > 1:
24
-		mid = len(lista)//2
25
-		left = lista[:mid]
26
-		right = lista[mid:]
27
-		mergeSort(left)
28
-		mergeSort(right)
29
-		
30
-		i = j = k = 0
31
-		
32
-		while i < len(left) and j < len(right):
33
-			if left[i] < right[j]:
34
-				lista[k] = left[i]
35
-				i += 1
36
-			else:
37
-				lista[k] = right[j]
38
-				j += 1
39
-			k += 1
40
-		while i < len(left):
41
-			lista[k] = left[i]
42
-			i += 1
43
-			k += 1
44
-		while j < len(right):
45
-			lista[k] = right[j]
46
-			j += 1
47
-			k += 1
48
-
49
-	return lista
24
+    # definan el algoritmo de ordenamiento mergesort
25
+    if len(lista) > 1:
26
+        mid = len(lista)//2
27
+        left = lista[:mid]
28
+        right = lista[mid:]
29
+        mergeSort(left)
30
+        mergeSort(right)
31
+
32
+        i = j = k = 0
33
+
34
+        while i < len(left) and j < len(right):
35
+            if left[i] < right[j]:
36
+                lista[k] = left[i]
37
+                i += 1
38
+            else:
39
+                lista[k] = right[j]
40
+                j += 1
41
+            k += 1
42
+        while i < len(left):
43
+            lista[k] = left[i]
44
+            i += 1
45
+            k += 1
46
+        while j < len(right):
47
+            lista[k] = right[j]
48
+            j += 1
49
+            k += 1
50
+
51
+    return lista
50 52
 
51 53
 
52 54
 # Tomada de: https://www.geeksforgeeks.org/heap-sort/
53 55
 # To heapify subtree rooted at index i.
54
-# n is size of heap 
56
+# n is size of heap
55 57
 def heapify(arr, n, i):
56 58
     largest = i  # Initialize largest as root
57 59
     l = 2 * i + 1     # left = 2*i + 1
58 60
     r = 2 * i + 2     # right = 2*i + 2
59
- 
61
+
60 62
     # See if left child of root exists and is
61 63
     # greater than root
62 64
     if l < n and arr[largest] < arr[l]:
63 65
         largest = l
64
- 
66
+
65 67
     # See if right child of root exists and is
66 68
     # greater than root
67 69
     if r < n and arr[largest] < arr[r]:
68 70
         largest = r
69
- 
71
+
70 72
     # Change root, if needed
71 73
     if largest != i:
72 74
         arr[i], arr[largest] = arr[largest], arr[i]  # swap
73
- 
75
+
74 76
         # Heapify the root.
75 77
         heapify(arr, n, largest)
76 78
 
77 79
 # Tomada de: https://www.geeksforgeeks.org/heap-sort/
78
-def heapSort(lista):
79
-	#definan el algoritmo de ordenamiento heapsort
80
-	n = len(lista)
81
- 
82
-    # Build a maxheap.
83
-	for i in range(n//2 - 1, -1, -1):
84
-		heapify(lista, n, i)
85
- 
86
-    # One by one extract elements
87
-	for i in range(n-1, 0, -1):
88
-		lista[i], lista[0] = lista[0], lista[i]  # swap
89
-		heapify(lista, i, 0)
90
- 
91
-	return lista
92 80
 
93 81
 
94
-def quickSort(lista):
95
-	#definan el algoritmo de ordenamiento quicksort
96
-	return lista
97
-
82
+def heapSort(lista):
83
+    # definan el algoritmo de ordenamiento heapsort
84
+    n = len(lista)
98 85
 
99
-def shellSort(lista):
100
-	#definan el algoritmo de ordenamiento shellsort
101
-        
102
-        #Variable para saber cuando el sort termina
103
-        termine = False
104
-        #Variable para el tamaño de la lista.
105
-        n = len(lista)
106
-        #Variable para la mitad del tamaño de la lista.
107
-        k = int(n/2)
108
-        #Variables para realizar las comparaciones de los elementos.
109
-        i = 0
110
-        j = k
111
-
112
-        #Ciclo donde se realiza el ShellSort.
113
-        while(termine == False):
114
-
115
-            #Comparacion de elementos para ver si se puede hacer un swap.
116
-            if(lista[i] > lista[j]):
117
-                
118
-                swap(lista, i, j)
119
-
120
-                #Variables para retener el valor original de x, y para continuar el sort.
121
-                tmp1 = i
122
-                tmp2 = j
123
-
124
-                #Ciclo para realizar swaps en elementos anteriores luego de encontrar un swap.
125
-                while True:
126
-
127
-                    #Verificacion para prevenir que se busquen elementos fuera de la lista.
128
-                    if((i-k) >= 0):
129
-                        i = i - k
130
-                        j = j -k
131
-                    else:
132
-                        i = tmp1
133
-                        j = tmp2
134
-                        break
135
-                    
136
-                    #Verificacion si se puede hacer otro swap.
137
-                    if(lista[i] > lista[j]):
138
-                        swap(lista, i , j)
139
-                    else:
140
-                        i = tmp1
141
-                        j = tmp2
142
-                        break
143
-
144
-                #Estos ajustes se utilizan para continuar verificando elementos
145
-                #mas adelantes en la lista.
146
-                i = i + 1
147
-                j = j + 1
86
+    # Build a maxheap.
87
+    for i in range(n//2 - 1, -1, -1):
88
+        heapify(lista, n, i)
148 89
 
149
-            else:
150
-                #Estos ajustes se utilizan para continuar verificando elementos
151
-                #mas adelantes en la lista.
152
-                i = i + 1
153
-                j = j + 1
90
+    # One by one extract elements
91
+    for i in range(n-1, 0, -1):
92
+        lista[i], lista[0] = lista[0], lista[i]  # swap
93
+        heapify(lista, i, 0)
154 94
 
95
+    return lista
155 96
 
156
-            #Verifica antes de salirse de la lista para poder comenzar otra vuelta con k/2.
157
-            if(j == n):
158
-                k = int(k/2)
159
-                i = 0 
160
-                j = k
161 97
 
162
-            #Identifica cuando el sort se supone que haya terminado.
163
-            if(k == 0):
164
-                termine = True
98
+def quickSort(lista):
99
+    # definan el algoritmo de ordenamiento quicksort
165 100
 
101
+    # If lista is empty or has only one element.
102
+    if len(lista) <= 1:
166 103
         return lista
167 104
 
105
+    # Else, set pivot to a random element of the list.
106
+    else:
107
+        pivot = lista[randint(0, len(lista)-1)]
108
+
109
+        # Create three list for the numbers lesser, equal and greater than the pivot.
110
+        lesser = []
111
+        equal = []
112
+        greater = []
113
+
114
+        # Iterate through the list and add the elements to the respective list.
115
+        for i in lista:
116
+            if i < pivot:
117
+                lesser.append(i)
118
+            elif i > pivot:
119
+                greater.append(i)
120
+            else:
121
+                equal.append(i)
122
+        # Recursively call quickSort on the two lists and concatenate them with the equal list.
123
+        return quickSort(lesser) + equal + quickSort(greater)
168 124
 
169
-maxValor=1000 	#define el valor maximo de los elementos de la lista
170
-largoLista=1000 #define el largo de las listas a ordenar
171
-veces=100 		#define las veces que se va a hacer el ordenamiento 
172 125
 
173
-acumulaMerge=0 	#variable para acumular el tiempo de ejecucion del mergesort
174
-acumulaHeap=0 	#variable para acumular el tiempo de ejecucion del heapsort
175
-acumulaQuick=0 	#variable para acumular el tiempo de ejecucion del quicksort
176
-acumulaShell=0 	#variable para acumular el tiempo de ejecucion del shellsort
126
+def shellSort(lista):
127
+    # definan el algoritmo de ordenamiento shellsort
128
+
129
+    # Variable para saber cuando el sort termina
130
+    termine = False
131
+    # Variable para el tamaño de la lista.
132
+    n = len(lista)
133
+    # Variable para la mitad del tamaño de la lista.
134
+    k = int(n/2)
135
+    # Variables para realizar las comparaciones de los elementos.
136
+    i = 0
137
+    j = k
138
+
139
+    # Ciclo donde se realiza el ShellSort.
140
+    while(termine == False):
141
+
142
+        # Comparacion de elementos para ver si se puede hacer un swap.
143
+        if(lista[i] > lista[j]):
144
+
145
+            swap(lista, i, j)
146
+
147
+            # Variables para retener el valor original de x, y para continuar el sort.
148
+            tmp1 = i
149
+            tmp2 = j
150
+
151
+            # Ciclo para realizar swaps en elementos anteriores luego de encontrar un swap.
152
+            while True:
153
+
154
+                # Verificacion para prevenir que se busquen elementos fuera de la lista.
155
+                if((i-k) >= 0):
156
+                    i = i - k
157
+                    j = j - k
158
+                else:
159
+                    i = tmp1
160
+                    j = tmp2
161
+                    break
162
+
163
+                # Verificacion si se puede hacer otro swap.
164
+                if(lista[i] > lista[j]):
165
+                    swap(lista, i, j)
166
+                else:
167
+                    i = tmp1
168
+                    j = tmp2
169
+                    break
170
+
171
+            # Estos ajustes se utilizan para continuar verificando elementos
172
+            # mas adelantes en la lista.
173
+            i = i + 1
174
+            j = j + 1
175
+
176
+        else:
177
+            # Estos ajustes se utilizan para continuar verificando elementos
178
+            # mas adelantes en la lista.
179
+            i = i + 1
180
+            j = j + 1
181
+
182
+        # Verifica antes de salirse de la lista para poder comenzar otra vuelta con k/2.
183
+        if(j == n):
184
+            k = int(k/2)
185
+            i = 0
186
+            j = k
187
+
188
+        # Identifica cuando el sort se supone que haya terminado.
189
+        if(k == 0):
190
+            termine = True
191
+
192
+    return lista
193
+
194
+
195
+maxValor = 1000  # define el valor maximo de los elementos de la lista
196
+largoLista = 1000  # define el largo de las listas a ordenar
197
+veces = 100  # define las veces que se va a hacer el ordenamiento
198
+
199
+acumulaMerge = 0  # variable para acumular el tiempo de ejecucion del mergesort
200
+acumulaHeap = 0  # variable para acumular el tiempo de ejecucion del heapsort
201
+acumulaQuick = 0  # variable para acumular el tiempo de ejecucion del quicksort
202
+acumulaShell = 0  # variable para acumular el tiempo de ejecucion del shellsort
177 203
 
178 204
 for i in range(veces):
179
-	lista = [randint(0,maxValor) for r in range(largoLista)] #creamos una lista con valores al azar
180
-
181
-	listaMerge = lista[:]
182
-	listaHeap = lista[:]
183
-	listaQuick = lista[:]
184
-	listaShell = lista[:]
185
-	
186
-	t1 = time.process_time()				#seteamos el tiempo al empezar
187
-	mergeSort(listaMerge) 						#ejecutamos el algoritmo mergeSort
188
-	acumulaMerge+=time.process_time()-t1 	#acumulamos el tiempo de ejecucion
189
-	
190
-	t1 = time.process_time()				#seteamos el tiempo al empezar
191
-	heapSort(listaHeap)							#ejecutamos el algoritmo heapSort
192
-	acumulaHeap+=time.process_time()-t1 	#acumulamos el tiempo de ejecucion
193
-	
194
-	t1 = time.process_time()						#seteamos el tiempo al empezar
195
-	quickSort(listaQuick)						#ejecutamos el algoritmo quickSort
196
-	acumulaQuick+=time.process_time()-t1 	#acumulamos el tiempo de ejecucion
197
-	
198
-	t1 = time.process_time()				#seteamos el tiempo al empezar
199
-	shellSort(listaShell)						#ejecutamos el algoritmo shellSort
200
-	acumulaShell+=time.process_time()-t1 	#acumulamos el tiempo de ejecucion
201
-
202
-#imprimos los resultados
203
-print ("Promedio de tiempo de ejecucion de "+ str(veces) +" listas de largo " + str(largoLista))
204
-print ("MergeSort " + str(acumulaMerge/veces) + " segundos")
205
-print ("HeapSort " + str(acumulaHeap/veces) + " segundos")
206
-print ("QuickSort " + str(acumulaQuick/veces) + " segundos")
207
-print ("ShellSort " + str(acumulaShell/veces) + " segundos")
208
-
205
+    # creamos una lista con valores al azar
206
+    lista = [randint(0, maxValor) for r in range(largoLista)]
207
+
208
+    listaMerge = lista[:]
209
+    listaHeap = lista[:]
210
+    listaQuick = lista[:]
211
+    listaShell = lista[:]
212
+
213
+    t1 = time.process_time()  # seteamos el tiempo al empezar
214
+    mergeSort(listaMerge)  # ejecutamos el algoritmo mergeSort
215
+    acumulaMerge += time.process_time()-t1  # acumulamos el tiempo de ejecucion
216
+
217
+    t1 = time.process_time()  # seteamos el tiempo al empezar
218
+    heapSort(listaHeap)  # ejecutamos el algoritmo heapSort
219
+    acumulaHeap += time.process_time()-t1  # acumulamos el tiempo de ejecucion
220
+
221
+    t1 = time.process_time()  # seteamos el tiempo al empezar
222
+    quickSort(listaQuick)  # ejecutamos el algoritmo quickSort
223
+    acumulaQuick += time.process_time()-t1  # acumulamos el tiempo de ejecucion
224
+
225
+    t1 = time.process_time()  # seteamos el tiempo al empezar
226
+    shellSort(listaShell)  # ejecutamos el algoritmo shellSort
227
+    acumulaShell += time.process_time()-t1  # acumulamos el tiempo de ejecucion
228
+
229
+# imprimos los resultados
230
+print("Promedio de tiempo de ejecucion de " +
231
+      str(veces) + " listas de largo " + str(largoLista))
232
+print("MergeSort " + str(acumulaMerge/veces) + " segundos")
233
+print("HeapSort " + str(acumulaHeap/veces) + " segundos")
234
+print("QuickSort " + str(acumulaQuick/veces) + " segundos")
235
+print("ShellSort " + str(acumulaShell/veces) + " segundos")