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 ("\n Tempo de execução: %f" % (end - start ))
0 commit comments