浏览代码

Update sorting.py by adding heap sort code

luislopez66 2 年前
父节点
当前提交
ebbb999c65
共有 2 个文件被更改,包括 53 次插入112 次删除
  1. 53
    0
      heap.py
  2. 0
    112
      sorting.py

+ 53
- 0
heap.py 查看文件

@@ -0,0 +1,53 @@
1
+# Luis Andrés López Mañán
2
+# Program written by hand as a draft on 09/19/2022
3
+# Credit goes to GeeksForGeeks
4
+# Link: https://www.geeksforgeeks.org/python-program-for-heap-sort/
5
+# Last access on 09/19/2022
6
+# Program wrriten and edited on 10/10/2022
7
+
8
+# This function heapifies a subtree rooted at an index
9
+# i. Also, n is the size of a heap and arr is array.
10
+
11
+def heapify (arr, n, i):
12
+		# largest is root for now
13
+		largest = i
14
+		
15
+		# left child of root
16
+		left = 2 * i + 1
17
+		
18
+		# right child of root
19
+		right = 2 * i + 2
20
+		
21
+		# Checks if root has a left child and is greater
22
+		# than root
23
+		if l < n and arr[i] < arr[l] :
24
+			largest = l
25
+			
26
+		# Checks if root has a right child and is greater
27
+		# than root
28
+		if r < n and arr[largest] < arr[r]:
29
+			largest = r
30
+			
31
+		# If necessary, this changes root by swapping va-
32
+		# lues
33
+		arr[i], arr[largest] = arr[largest], arr[i]
34
+		
35
+		# This heapifies the root repeatedly
36
+		heapify(arr, n, largest)
37
+		
38
+# This function sorts an array of a given size n
39
+def heapSort(arr, n):
40
+		# A max heap is built and last parent will be at
41
+		# position number h1, i.e., half the given size of
42
+		# and array. Therefore, that will be the starting
43
+		# location.
44
+		h1 = n // 2 - 1
45
+		for i in range(h1, -1, -1):
46
+			heapify(arr, n, i)
47
+			
48
+		# This extracts elements one by one.
49
+		for i in range(n - 1, 0, -1):
50
+			# Swaps, then heapifies
51
+			arr[i], arr[0] = arr[0], arr[i]
52
+			heapify(arr, i, 0)
53
+		

+ 0
- 112
sorting.py 查看文件

@@ -1,112 +0,0 @@
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
-	return lista
41
-
42
-
43
-''' 
44
-	This algorithm was taken from: https://www.programiz.com/dsa/shell-sort 
45
-	and was adapted in order to work for this assigment.
46
-'''
47
-
48
-
49
-def shellSort(lista):
50
-	# Determine the list size to find the gap.
51
-	n = len(lista)
52
-	gap = n // 2
53
-
54
-	# this algorithm will run until gap reaches 1
55
-	while gap > 0:
56
-		for i in range(gap, n):
57
-			temp = lista[i]  # storing all items from lista into temp
58
-			j = i
59
-
60
-			# compares the number in temp with the 0th possition (start of list)
61
-			# if temp is larger than the first element then we swap them
62
-			while j >= gap and lista[j - gap] > temp:
63
-				lista[j] = lista[j - gap]
64
-				j -= gap
65
-
66
-			lista[j] = temp
67
-		gap = gap // 2  # decreases the gap to continue the loop
68
-
69
-	return lista
70
-
71
-
72
-maxValor = 1000  # define el valor maximo de los elementos de la lista
73
-largoLista = 1000  # define el largo de las listas a ordenar
74
-veces = 100  # define las veces que se va a hacer el ordenamiento
75
-
76
-acumulaMerge = 0  # variable para acumular el tiempo de ejecucion del mergesort
77
-acumulaHeap = 0  # variable para acumular el tiempo de ejecucion del heapsort
78
-acumulaQuick = 0  # variable para acumular el tiempo de ejecucion del quicksort
79
-acumulaShell = 0  # variable para acumular el tiempo de ejecucion del shellsort
80
-
81
-for i in range(veces):
82
-	mergelista = [randint(0, maxValor) for r in range(largoLista)]  # creamos una lista con valores al azar
83
-	heaplista = list(mergelista)
84
-	quicklista = list(mergelista)
85
-	searchlista = list(mergelista)
86
-
87
-	t1 = time.process_time()  # tomamos el tiempo inicial
88
-	mergeSort(mergelista, 0, len(mergelista) - 1)  # ejecutamos el algoritmo mergeSort
89
-	acumulaMerge += time.process_time() - t1  # acumulamos el tiempo de ejecucion
90
-	print(mergelista)  # desplegamos la lista
91
-
92
-	t1 = time.process_time()  # tomamos el tiempo inicial
93
-	heapSort(heaplista)  # ejecutamos el algoritmo heapSort
94
-	acumulaHeap += time.process_time() - t1  # acumulamos el tiempo de ejecucion
95
-	# print(heaplista)						#desplegamos la lista
96
-
97
-	t1 = time.process_time()  # tomamos el tiempo inicial
98
-	quickSort(quicklista)  # ejecutamos el algoritmo quickSort
99
-	acumulaQuick += time.process_time() - t1  # acumulamos el tiempo de ejecucion
100
-	# print(quicklista)						#desplegamos la lista
101
-
102
-	t1 = time.process_time()  # tomamos el tiempo inicial
103
-	shellSort(searchlista)  # ejecutamos el algoritmo shellSort
104
-	acumulaShell += time.process_time() - t1  # acumulamos el tiempo de ejecucion
105
-	print(searchlista)  # desplegamos la lista
106
-
107
-# imprimos los resultados
108
-print("Promedio de tiempo de ejecucion de " + str(veces) + " listas de largo " + str(largoLista))
109
-print("MergeSort " + str(acumulaMerge / veces) + " segundos")
110
-print("HeapSort " + str(acumulaHeap / veces) + " segundos")
111
-print("QuickSort " + str(acumulaQuick / veces) + " segundos")
112
-print("ShellSort " + str(acumulaShell / veces) + " segundos")