Advertisement
Infiniti_Inter

13

Nov 13th, 2019
279
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.96 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <fstream>
  4. #include <exception>
  5. using namespace std;
  6.  
  7.  
  8.  
  9. ifstream in("input.txt");
  10. ofstream out("output.txt");
  11. /*
  12. 5
  13. 281 Petrov Denis Valer 2000 5 5 5 5 5
  14. 281 Petrov Denis Valer 2001 5 5 5 5 5
  15. 281 Karpenko Oksana Sergeevna 2001 3 4 5 5 5
  16. 181 Merkulov Bogdan Olegovich 2000 5 1 2 4 5
  17. 424 Afroond Georg Elesev 1999 2 3 4 5 1
  18. */
  19.  
  20. struct Student {
  21.  
  22. private:
  23.     int group;
  24.     string firstName;
  25.     string Surname;
  26.     string secondName;
  27.     int dateOfBirth;
  28.     int mark[5];
  29.  
  30. public:
  31.     Student() {};
  32.     void initStudent()
  33.     {
  34.         in >> group >> Surname >> firstName >> secondName >> dateOfBirth;
  35.         for (int i = 0; i < 5; ++i)
  36.             in >> mark[i];
  37.     }
  38.     void printToFile()
  39.     {
  40.         out << group << ' ' << Surname << ' ' << firstName << ' ' << secondName << ' ' << dateOfBirth << ' ';
  41.         for (int i = 0; i < 5; ++i)
  42.             out << mark[i] << ' ';
  43.         out << '\n';
  44.     }
  45.  
  46.     bool operator < (Student & a)
  47.     {
  48.         if (this->Surname < a.Surname || this->Surname == a.Surname && this->dateOfBirth < dateOfBirth)
  49.             return true;
  50.         return false;
  51.     }
  52.     bool operator > (Student & a)
  53.     {
  54.         if (this->Surname > a.Surname || this->Surname == a.Surname && this->dateOfBirth > dateOfBirth)
  55.             return true;
  56.         return false;
  57.     }
  58. };
  59.  
  60.  
  61. void siftDown(Student *studentss, int root, int bottom)
  62. {
  63.     int maxChild; // индекс максимального потомка
  64.     int done = 0; // флаг того, что куча сформирована
  65.     // Пока не дошли до последнего ряда
  66.     while ((root * 2 <= bottom) && (!done))
  67.     {
  68.         if (root * 2 == bottom)    // если мы в последнем ряду,
  69.             maxChild = root * 2;    // запоминаем левый потомок
  70.           // иначе запоминаем больший потомок из двух
  71.         else if (studentss[root * 2] > studentss[root * 2 + 1])
  72.             maxChild = root * 2;
  73.         else
  74.             maxChild = root * 2 + 1;
  75.         // если элемент вершины меньше максимального потомка
  76.         if (studentss[root] < studentss[maxChild])
  77.         {
  78.             swap(studentss[root], studentss[maxChild]);
  79.             root = maxChild;
  80.         }
  81.         else // иначе
  82.             done = 1; // пирамида сформирована
  83.     }
  84. }
  85. // Функция сортировки на куче
  86. void heapSort(Student *studentss, int array_size)
  87. {
  88.     // Формируем нижний ряд пирамиды
  89.     for (int i = (array_size / 2) - 1; i >= 0; i--)
  90.         siftDown(studentss, i, array_size - 1);
  91.     // Просеиваем через пирамиду остальные элементы
  92.     for (int i = array_size - 1; i >= 1; i--)
  93.     {
  94.         swap(studentss[0], studentss[i]);
  95.         siftDown(studentss, 0, i - 1);
  96.     }
  97. }
  98.  
  99.  
  100.  
  101.  
  102. int main()
  103. {
  104.     int n;
  105.     in >> n;
  106.     Student * a = new Student[n];
  107.  
  108.     for (int i = 0; i < n; i++)
  109.         a[i].initStudent();
  110.  
  111.     heapSort(a, n); // вызов функции сортировки
  112.  
  113.     for (int i = 0; i < n; i++)
  114.         a[i].printToFile();
  115.     printf("\n");
  116.     return 0;
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement