Переглянути джерело

Update sorting.py by removing time.clock() and adding merge, heap, and shellsort codes

luislopez66 2 роки тому
джерело
коміт
6ba31b4492
1 змінених файлів з 137 додано та 0 видалено
  1. 137
    0
      sorting.py

+ 137
- 0
sorting.py Переглянути файл

@@ -0,0 +1,137 @@
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
+import heapify  # Se importa esa librería para usar heapify
13
+
14
+'''
15
+ 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..
16
+ Merges two subarrays of arr[].
17
+ First subarray is arr[l..m]
18
+ Second subarray is arr[m+1..r]
19
+'''
20
+
21
+
22
+def mergeSort(lista, l, r):
23
+	if l < r:
24
+		# Same as (l+r)//2, but avoids overflow for
25
+		# large l and h
26
+		m = l + (r - l) // 2
27
+
28
+		# Sort first and second halves
29
+		mergeSort(lista, l, m)
30
+		mergeSort(lista, m + 1, r)
31
+		merge(lista, l, m, r)
32
+
33
+
34
+""" Código tomado de GeeksForGeeks.
35
+	Enlace electrónico del código 
36
+ 	encontrado y adaptado para la
37
+  	asignación o el proyecto de prác-
38
+   	tica con git: https://www.geeksforgeeks.org/heap-sort/
39
+"""
40
+
41
+
42
+def heapSort(lista):
43
+	#definan el algoritmo de ordenamiento heapsort
44
+	heapq.heapify(lista)
45
+
46
+	# Se busca el tamaño de la lista
47
+	n = len(lista)
48
+
49
+	""" Se crea un heap máximo y el último padre estará en
50
+		la posición h1, i.e., la mitad del tamaño de la lista.
51
+		Por lo tanto, ese sería el comienzo. 
52
+	"""
53
+	h1 = (n // 2) - 1
54
+	for i in range(h1, -1, -1):
55
+		heapq.heapify(lista[i])
56
+
57
+	# Se extrae los elementos uno a uno
58
+	for i in range(n-1, 0, -1):
59
+		# Se intercambia, luego se hace heapify
60
+		lista[i], lista[0] = lista[0], lista[i]
61
+		heapq.heapify(lista[i])
62
+
63
+	return lista
64
+
65
+
66
+def quickSort(lista):
67
+	#definan el algoritmo de ordenamiento quicksort
68
+	return lista
69
+
70
+
71
+''' 
72
+	This algorithm was taken from: https://www.programiz.com/dsa/shell-sort 
73
+	and was adapted in order to work for this assigment.
74
+'''
75
+
76
+
77
+def shellSort(lista):
78
+	# Determine the list size to find the gap.
79
+	n = len(lista)
80
+	gap = n // 2
81
+
82
+	# this algorithm will run until gap reaches 1
83
+	while gap > 0:
84
+		for i in range(gap, n):
85
+			temp = lista[i]  # storing all items from lista into temp
86
+			j = i
87
+
88
+			# compares the number in temp with the 0th possition (start of list)
89
+			# if temp is larger than the first element then we swap them
90
+			while j >= gap and lista[j - gap] > temp:
91
+				lista[j] = lista[j - gap]
92
+				j -= gap
93
+
94
+			lista[j] = temp
95
+		gap = gap // 2  # decreases the gap to continue the loop
96
+
97
+	return lista
98
+
99
+
100
+maxValor = 1000  # define el valor maximo de los elementos de la lista
101
+largoLista = 1000  # define el largo de las listas a ordenar
102
+veces = 100  # define las veces que se va a hacer el ordenamiento
103
+
104
+acumulaMerge = 0  # variable para acumular el tiempo de ejecucion del mergesort
105
+acumulaHeap = 0  # variable para acumular el tiempo de ejecucion del heapsort
106
+acumulaQuick = 0  # variable para acumular el tiempo de ejecucion del quicksort
107
+acumulaShell = 0  # variable para acumular el tiempo de ejecucion del shellsort
108
+
109
+for i in range(veces):
110
+	# creamos una lista con valores al azar
111
+	mergelista = [randint(0, maxValor) for r in range(largoLista)]
112
+	heaplista = list(mergelista)
113
+	quicklista = list(mergelista)
114
+	searchlista = list(mergelista)
115
+
116
+	t1 = time.clock()  # seteamos el tiempo al empezar
117
+	mergeSort(mergelista)  # ejecutamos el algoritmo mergeSort
118
+	acumulaMerge += time.process_time()-t1  # acumulamos el tiempo de ejecucion
119
+
120
+	t1 = time.clock()  # seteamos el tiempo al empezar
121
+	heapSort(heaplista)  # ejecutamos el algoritmo heapSort
122
+	acumulaHeap += time.process_time()-t1  # acumulamos el tiempo de ejecucion
123
+
124
+	t1 = time.clock()  # seteamos el tiempo al empezar
125
+	quickSort(quicklista)  # ejecutamos el algoritmo quickSort
126
+	acumulaQuick += time.process_time()-t1  # acumulamos el tiempo de ejecucion
127
+
128
+	t1 = time.clock()  # seteamos el tiempo al empezar
129
+	shellSort(searchlista)  # ejecutamos el algoritmo shellSort
130
+	acumulaShell += time.process_time()-t1  # acumulamos el tiempo de ejecucion
131
+
132
+#imprimos los resultados
133
+print "Promedio de tiempo de ejecucion de " + str(veces) + " listas de largo " + str(largoLista)
134
+print "MergeSort " + str(acumulaMerge/veces) + " segundos"
135
+print "HeapSort " + str(acumulaHeap/veces) + " segundos"
136
+print "QuickSort " + str(acumulaQuick/veces) + " segundos"
137
+print "ShellSort " + str(acumulaShell/veces) + " segundos"