-
Notifications
You must be signed in to change notification settings - Fork 0
/
HeapSort.cpp
122 lines (101 loc) · 2.49 KB
/
HeapSort.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include "HeapSort.h"
#include<iostream>
using namespace std;
//Construtor
HeapSort::HeapSort(int maxItems, ItemType* items, int length){
this->items = new ItemType[maxItems];
this->length = length;
this->maxItems = maxItems;
//faz uma copia do vetor para items
for(int i=0; i<length; i++){
this->items[i] = items[i];
}
//cria a Heap
int ultimoPai = ((length)/2) -1;
for(int i=ultimoPai; i>=0; i--){
descida(i, length);
}
}
//Destrutor
HeapSort::~HeapSort(){
delete [] items;
}
//Verifica vazio
bool HeapSort::isEmpty() const {
return (this->length == 0);
}
//Verifica cheio
bool HeapSort::isFull() const {
return (this->maxItems == this->length);
}
//Inserir no topo
void HeapSort::enqueue(ItemType itemType){
if(isFull()){
return;
}
this->items[this->length++] = itemType;
//Subir na Heap
subida(0, this->length-1);
}
//Retirar item do topo
ItemType HeapSort::dequeue(){
if(isEmpty()){
return ItemType();
}
ItemType itemRemoved = items[0];
items[0] = items[--length];
descida(0, length-1);
return (itemRemoved);
}
/*
*Sobe o elemento até a posição certa dele seguindo as ordens da Heap
*/
void HeapSort::subida(int root, int index){
ItemType pai = items[index/2-1];
if(items[index] > pai){
items[index/2-1] = items[index];
items[index] = pai;
subida(root, index/2-1);
}
}
/*
*Desce o elemento até a posição certa dele seguindo as ordens da Heap
*/
void HeapSort::descida(int index, int bottom){
//filho é a posição do filho da esquerda de index
int filho = 2*index + 1;
if(filho < bottom ){
//Se existe o filho da esquerda
if(filho+1 < bottom && items[filho] < items[filho+1]){
//se existe o filho da esquerda e o da direita e o da direita for maior
//que o filho da esquerda
//pega o maior filho
filho++;
}
if(items[filho] > items[index]){
//Se o filho for maior que o pai, troca ele de posição
ItemType aux = items[index];
items[index] = items[filho];
items[filho] = aux;
//desce o filho com o tamanho da lista
descida(filho, bottom);
}
}
}
/**
*Ordena a Heap em ordem crescente
*
*/
void HeapSort::sort(){
//int bottom - tamanho da lista, vai decrescentando conforme o ultimo elemento foi ordenado
int bottom = length;
while(bottom > 0){
//troca a posição do primeiro elemento com o ultimo elemento da lista
//decresce o bottom conforme o ultimo elemento for ordenado
ItemType aux = items[0];
items[0] = items[bottom-1];
items[bottom-1] = aux;
bottom--;
descida(0,bottom);
}
}