Skip to content

Commit c3a1f6d

Browse files
authored
HeapSort Algorithm
0 parents  commit c3a1f6d

File tree

1 file changed

+121
-0
lines changed

1 file changed

+121
-0
lines changed

HeapSort.py

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
'''
2+
Código implementado do algoritmo de Heap Sort
3+
Implementado usando Heap de Máximo ou Heap Máxima
4+
Os números vem de um arquivo txt gerado
5+
6+
código feito por Isaias @Isaius
7+
'''
8+
9+
import time
10+
import timeit
11+
12+
# CONSTANTES
13+
RANDOM = "aleatorios"
14+
CRESC = "crescentes"
15+
DECRES = "decrescentes"
16+
17+
N_100 = "100.txt"
18+
N_500 = "500.txt"
19+
N_1k = "1k.txt"
20+
N_5k = "5k.txt"
21+
N_30k = "30k.txt"
22+
N_80k = "80k.txt"
23+
N_100k = "100k.txt"
24+
N_150k = "150k.txt"
25+
N_200k = "200k.txt"
26+
# FIM DAS CONSTANTES
27+
28+
# carrega a entrada escolhida do arquivo para o array
29+
def loadEntry(type_entry, quantity):
30+
file = open(str(type_entry) + '/' + str(quantity), 'r')
31+
text = file.read()
32+
auxVet = []
33+
auxVet = text.split(" ")
34+
numbers = []
35+
36+
for i in range(0, len(auxVet)-1):
37+
numbers.append((int(auxVet[i])))
38+
39+
return numbers
40+
41+
# calcula e retorna o filho à esquerda do nó
42+
def leftSon(array, i):
43+
return 2*i
44+
45+
# calcula e retorna o filho à direita do nó
46+
def rightSon(array, i):
47+
return 2*i+1
48+
49+
# troca o elemento i com o bigger dentro do array
50+
def swap(array, i, bigger):
51+
array[i], array[bigger] = array[bigger], array[i]
52+
53+
def remakeMaxHeap(array, i, sizeHeap):
54+
# calculando o indice do filho à esquerda
55+
left = leftSon(array, i)
56+
# calculando o indice do filho à direita
57+
right = rightSon(array, i)
58+
# considera-se o pai como o maior, para poder
59+
# seguir a definição da Heap de Maximo, onde
60+
# o pai deve ser sempre maior que os filhos
61+
bigger = i
62+
# se o filho à esquerda não for um nó folha, pois está
63+
# na primeira metade do array da Heap de Maximo
64+
# e seu valor for maior do que o pai
65+
if left <= sizeHeap and array[left] > array[bigger]:
66+
# então o maior passa a ser o filho à esquerda
67+
bigger = left
68+
# se o filho à direita não for nó folha e
69+
# maior que o maior atual (filho ou pai)
70+
if right <= sizeHeap and array[right] > array[bigger]:
71+
# emtão o maior passa a ser o filho à direita
72+
bigger = right
73+
# caso o pai (i) não seja mais o maior valor, e por consequencia
74+
# não está na estrutura da Heap de Máximo, então devemos refaze-la
75+
if bigger != i:
76+
# primeiro troca-se o pai de lugar com o maior filho
77+
swap(array, i, bigger)
78+
# e passa a verificar para baixo deles se ainda está obedecendo
79+
# a definição da estrutura da Heap de Maximo para todos os filhos
80+
remakeMaxHeap(array, bigger, sizeHeap)
81+
82+
def makeMaxHeap(array, sizeHeap):
83+
# for da metade da Heap até o primeiro elemento
84+
for i in range((int(sizeHeap/2)), -1, -1):
85+
# reconstruindo a estrutura da Heap de Maximo
86+
remakeMaxHeap(array, i, sizeHeap)
87+
88+
def HeapSort(array):
89+
# guardando o tamanho maixmo do array (n)
90+
sizeArray = len(array)-1
91+
# gurdando o tamanho da nossa Heap maxima
92+
# que inicia com tamanho igual ao array (n)
93+
sizeHeap = sizeArray
94+
# construindo a estutura da nossa Heap maxima
95+
makeMaxHeap(array, sizeHeap)
96+
# for do ultimo elemento do array até o segundo (1)
97+
for i in range(len(array)-1, -1, -1):
98+
# troca o os dois elementos de lugar
99+
swap(array, 0, i)
100+
# decrementa o tamanho considerado da Heap
101+
# pois o ultimo ja é o maior, e por consequencia
102+
# ordenado e não precisa mais ser considerado
103+
sizeHeap = sizeHeap - 1
104+
# refaz a estrutura da Heap de maximo
105+
remakeMaxHeap(array, 0, sizeHeap)
106+
107+
########## MAIN CODE ###########
108+
109+
# recebendo o array de entrada, do tipo e tamanho especificados
110+
array = loadEntry(CRESC, N_1k)
111+
112+
# gravando o tempo de inicio do algoritmo
113+
start = timeit.default_timer()
114+
# executando o algoritmo em si
115+
HeapSort(array)
116+
# guardando o tempo de término do algoritmo
117+
end = timeit.default_timer()
118+
# mostrando o array ordenado
119+
print(array)
120+
# e o tempo de execução
121+
print("\nTempo de execução: %f" % (end - start))

0 commit comments

Comments
 (0)