Bladeren bron

added quicksort function

olaff 2 jaren geleden
bovenliggende
commit
70db61471e
1 gewijzigde bestanden met toevoegingen van 135 en 0 verwijderingen
  1. 135
    0
      Quicksort.py

+ 135
- 0
Quicksort.py Bestand weergeven

@@ -0,0 +1,135 @@
1
+"""
2
+Carlos J Corrada Bravo
3
+Este programa calcula el promedio de tiempo de ejecucion de cuatro algoritmos de ordenamiento
4
+La variable maxValor define el valor maximo de los elementos de la lista
5
+La variable largoLista define el largo de las listas a ordenar
6
+La variable veces define las veces que se va a hacer el ordenamiento 
7
+Al final se imprimen los promedios de cada algortimo
8
+"""
9
+from random import randint
10
+import time
11
+from merge import merge
12
+
13
+'''
14
+ Python program for implementation of MergeSort  taken from https://www.geeksforgeeks.org/python-program-for-merge-sort/#:~:text=Merge%20Sort%20is%20a%20Divide,assumes%20that%20arr%5Bl..
15
+ Merges two subarrays of arr[].
16
+ First subarray is arr[l..m]
17
+ Second subarray is arr[m+1..r]
18
+'''
19
+
20
+
21
+def mergeSort(lista, l, r):
22
+	if l < r:
23
+		# Same as (l+r)//2, but avoids overflow for
24
+		# large l and h
25
+		m = l + (r - l) // 2
26
+
27
+		# Sort first and second halves
28
+		mergeSort(lista, l, m)
29
+		mergeSort(lista, m + 1, r)
30
+		merge(lista, l, m, r)
31
+
32
+
33
+def heapSort(lista):
34
+	# definan el algoritmo de ordenamiento heapsort
35
+	return lista
36
+
37
+
38
+def quickSort(lista):
39
+	# definan el algoritmo de ordenamiento quicksort
40
+	elements = len(lista)
41
+    
42
+	#Base case
43
+	if elements < 2:
44
+		return lista
45
+    
46
+	current_position = 0        #Position of the partitioning element
47
+
48
+	for i in range(1, elements):        #Partitioning loop
49
+		if lista[i] <= lista[0]:
50
+			current_position += 1
51
+			temp = lista[i]
52
+			lista[i] = lista[current_position]
53
+			lista[current_position] = temp
54
+
55
+	temp = lista[0]
56
+	lista[0] = lista[current_position] 
57
+	lista[current_position] = temp          #Brings pivot to it's appropriate position
58
+    
59
+	left = quickSort(lista[0:current_position])         #Sorts the elements to the left of pivot
60
+	right = quickSort(lista[current_position+1:elements])       #sorts the elements to the right of pivot
61
+
62
+	lista = left + [lista[current_position]] + right        #Merging everything together
63
+	return lista
64
+
65
+
66
+''' 
67
+	This algorithm was taken from: https://www.programiz.com/dsa/shell-sort 
68
+	and was adapted in order to work for this assigment.
69
+'''
70
+
71
+
72
+def shellSort(lista):
73
+	# Determine the list size to find the gap.
74
+	n = len(lista)
75
+	gap = n // 2
76
+
77
+	# this algorithm will run until gap reaches 1
78
+	while gap > 0:
79
+		for i in range(gap, n):
80
+			temp = lista[i]  # storing all items from lista into temp
81
+			j = i
82
+
83
+			# compares the number in temp with the 0th possition (start of list)
84
+			# if temp is larger than the first element then we swap them
85
+			while j >= gap and lista[j - gap] > temp:
86
+				lista[j] = lista[j - gap]
87
+				j -= gap
88
+
89
+			lista[j] = temp
90
+		gap = gap // 2  # decreases the gap to continue the loop
91
+
92
+	return lista
93
+
94
+
95
+maxValor = 1000  # define el valor maximo de los elementos de la lista
96
+largoLista = 1000  # define el largo de las listas a ordenar
97
+veces = 100  # define las veces que se va a hacer el ordenamiento
98
+
99
+acumulaMerge = 0  # variable para acumular el tiempo de ejecucion del mergesort
100
+acumulaHeap = 0  # variable para acumular el tiempo de ejecucion del heapsort
101
+acumulaQuick = 0  # variable para acumular el tiempo de ejecucion del quicksort
102
+acumulaShell = 0  # variable para acumular el tiempo de ejecucion del shellsort
103
+
104
+for i in range(veces):
105
+	mergelista = [randint(0, maxValor) for r in range(largoLista)]  # creamos una lista con valores al azar
106
+	heaplista = list(mergelista)
107
+	quicklista = list(mergelista)
108
+	searchlista = list(mergelista)
109
+
110
+	t1 = time.process_time()  # tomamos el tiempo inicial
111
+	mergeSort(mergelista, 0, len(mergelista) - 1)  # ejecutamos el algoritmo mergeSort
112
+	acumulaMerge += time.process_time() - t1  # acumulamos el tiempo de ejecucion
113
+	print(mergelista)  # desplegamos la lista
114
+
115
+	t1 = time.process_time()  # tomamos el tiempo inicial
116
+	heapSort(heaplista)  # ejecutamos el algoritmo heapSort
117
+	acumulaHeap += time.process_time() - t1  # acumulamos el tiempo de ejecucion
118
+	# print(heaplista)						#desplegamos la lista
119
+
120
+	t1 = time.process_time()  # tomamos el tiempo inicial
121
+	quickSort(quicklista)  # ejecutamos el algoritmo quickSort
122
+	acumulaQuick += time.process_time() - t1  # acumulamos el tiempo de ejecucion
123
+	# print(quicklista)						#desplegamos la lista
124
+
125
+	t1 = time.process_time()  # tomamos el tiempo inicial
126
+	shellSort(searchlista)  # ejecutamos el algoritmo shellSort
127
+	acumulaShell += time.process_time() - t1  # acumulamos el tiempo de ejecucion
128
+	print(searchlista)  # desplegamos la lista
129
+
130
+# imprimos los resultados
131
+print("Promedio de tiempo de ejecucion de " + str(veces) + " listas de largo " + str(largoLista))
132
+print("MergeSort " + str(acumulaMerge / veces) + " segundos")
133
+print("HeapSort " + str(acumulaHeap / veces) + " segundos")
134
+print("QuickSort " + str(acumulaQuick / veces) + " segundos")
135
+print("ShellSort " + str(acumulaShell / veces) + " segundos")