@@ -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+
5984int 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 " ;
0 commit comments