Skip to content

Commit 20443d1

Browse files
committed
add heap sort
1 parent 534f3dc commit 20443d1

File tree

2 files changed

+61
-36
lines changed

2 files changed

+61
-36
lines changed

src_ordenacao_alianca_rebelde_algoritmo2/main.cc

Lines changed: 61 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -14,48 +14,73 @@ bool mustSwap(const Civilization &c1, const Civilization &c2) {
1414
}
1515
}
1616

17+
void heapify(vector<Civilization> &vec, int n, int i) {
18+
int largest = i;
19+
int l = 2 * i + 1;
20+
int r = 2 * i + 2;
21+
if (l < n && mustSwap(vec[l], vec[largest]))
22+
largest = l;
1723

18-
void merge(vector<Civilization> &vec, int low, int high, int mid) {
19-
int i, j, k;
20-
Civilization c[vec.size()];
21-
i = low;
22-
k = low;
23-
j = mid + 1;
24-
while (i <= mid && j <= high) {
25-
if (mustSwap(vec[i], vec[j])) {
26-
c[k] = vec[i];
27-
k++;
28-
i++;
29-
} else {
30-
c[k] = vec[j];
31-
k++;
32-
j++;
33-
}
34-
}
35-
while (i <= mid) {
36-
c[k] = vec[i];
37-
k++;
38-
i++;
39-
}
40-
while (j <= high) {
41-
c[k] = vec[j];
42-
k++;
43-
j++;
44-
}
45-
for (i = low; i < k; i++) {
46-
vec[i] = c[i];
24+
if (r < n && mustSwap(vec[r], vec[largest]))
25+
largest = r;
26+
if (largest != i) {
27+
swap(vec[i], vec[largest]);
28+
heapify(vec, n, largest);
4729
}
4830
}
4931

50-
void mergeSort(vector<Civilization> &vec, int L, int R) {
51-
if (L < R) {
52-
int m = (L + R) / 2;
53-
mergeSort(vec, L, m);
54-
mergeSort(vec, m + 1, R);
55-
merge(vec, L, R, m);
32+
33+
void heapSort(vector<Civilization> &vec, int n) {
34+
for (int i = n / 2 - 1; i >= 0; i--)
35+
heapify(vec, n, i);
36+
for (int i = n - 1; i >= 0; i--) {
37+
swap(vec[0], vec[i]);
38+
heapify(vec, i, 0);
5639
}
5740
}
5841

42+
43+
//void merge(vector<Civilization> &vec, int low, int high, int mid) {
44+
// int i, j, k;
45+
// Civilization c[vec.size()];
46+
// i = low;
47+
// k = low;
48+
// j = mid + 1;
49+
// while (i <= mid && j <= high) {
50+
// if (mustSwap(vec[i], vec[j])) {
51+
// c[k] = vec[i];
52+
// k++;
53+
// i++;
54+
// } else {
55+
// c[k] = vec[j];
56+
// k++;
57+
// j++;
58+
// }
59+
// }
60+
// while (i <= mid) {
61+
// c[k] = vec[i];
62+
// k++;
63+
// i++;
64+
// }
65+
// while (j <= high) {
66+
// c[k] = vec[j];
67+
// k++;
68+
// j++;
69+
// }
70+
// for (i = low; i < k; i++) {
71+
// vec[i] = c[i];
72+
// }
73+
//}
74+
//
75+
//void mergeSort(vector<Civilization> &vec, int L, int R) {
76+
// if (L < R) {
77+
// int m = (L + R) / 2;
78+
// mergeSort(vec, L, m);
79+
// mergeSort(vec, m + 1, R);
80+
// merge(vec, L, R, m);
81+
// }
82+
//}
83+
5984
int main() {
6085
int N = 0;
6186
cin >> N;
@@ -67,7 +92,7 @@ int main() {
6792
civilizations.push_back(new Civilization(input, distance, size));
6893
}
6994
int MAX_LENGTH = civilizations.size() - 1;
70-
mergeSort(civilizations, 0, MAX_LENGTH);
95+
heapSort(civilizations, MAX_LENGTH);
7196
for (auto &&civilization : civilizations) {
7297
cout << civilization.getName().c_str() << " " << civilization.getDistance() << " " << civilization.getSize()
7398
<< "\n";

src_ordenacao_alianca_rebelde_algoritmo2/tp1.testresult

Whitespace-only changes.

0 commit comments

Comments
 (0)