Advertisement
iamakulov

Course Task Sorting Example

Apr 11th, 2014
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.22 KB | None | 0 0
  1. /**
  2.  * @brief Структура Stack реализует динамический список-стек.
  3.  *
  4.  * Для того, чтобы в стеке можно было хранить любые данные, в качестве типа переменной #inf используется void*.
  5.  */
  6. struct Stack
  7. {
  8.     struct Stack *next; ///< Указатель на следующий элемент
  9.     void *inf;  ///< Информация, хранящаясяя в данном элементе
  10. };
  11.  
  12. /**
  13.  * @brief Тип FlightInformation предназначен для хранения информации о полёте.
  14.  */
  15. struct FlightInformation
  16. {
  17.     int id; ///< Номер рейса
  18.     size_t cityId; ///< Номер целевого города в кодификаторе
  19.     int distance;   ///< Расстояние от Донецка до целевого города
  20.     int adultTicketCost;    ///< Стоимость взрослого билета
  21.     int childTicketCost;    ///< Стоимость детского билета
  22.     char departureTime[6];  ///< Время отправления
  23.     char arrivalTime[6];    ///< Время прибытия
  24. };
  25.  
  26. /**
  27.  * @brief Находит длину стека за O(N).
  28.  * @param beg Указатель на начало стека.
  29.  * @return Длина стека.
  30.  */
  31. size_t StackLength(const struct Stack *beg)
  32. {
  33.     size_t size = 0;
  34.     struct Stack *run = beg;
  35.     while (run != NULL) {
  36.         ++size;
  37.         run = run->next;
  38.     }
  39.     return size;
  40. }
  41.  
  42. enum FieldType { FieldType_Id = 1, FieldType_CityId, FieldType_Distance,
  43.                  FieldType_AdultTicketCost, FieldType_ChildTicketCost,
  44.                  FieldType_DepartureTime, FieldType_ArrivalTime };
  45.  
  46.  
  47. /**
  48.  * @brief Сравнивает заданное поле структур #left и #right.
  49.  * @param fieldType Тип поля, которое нужно сравнить.
  50.  * @return True, если заданное поле #left <= заданного поля #right, иначе False.
  51.  */
  52. Bool lessOrEqualThan(const struct FlightInformation *left, const struct FlightInformation *right, enum FieldType fieldType)
  53. {
  54.     int compResult = 0;
  55.  
  56.     switch (fieldType) {
  57.     case FieldType_Id:
  58.         return left->id <= right->id;
  59.     case FieldType_CityId:
  60.         return left->cityId <= right->cityId;
  61.     case FieldType_Distance:
  62.         return left->distance <= right->distance;
  63.     case FieldType_AdultTicketCost:
  64.         return left->adultTicketCost <= right->adultTicketCost;
  65.     case FieldType_ChildTicketCost:
  66.         return left->childTicketCost <= right->childTicketCost;
  67.     case FieldType_DepartureTime:
  68.         compResult = strcmp(left->departureTime, right->departureTime);
  69.         return compResult <= 0;
  70.     case FieldType_ArrivalTime:
  71.         compResult = strcmp(left->arrivalTime, right->arrivalTime);
  72.         return compResult <= 0;
  73.     }
  74.  
  75.     return False;
  76. }
  77.  
  78. /**
  79.  * @brief Сортирует стек рейсов "школьной" сортировкой по заданному полю.
  80.  * @param archiveStack Сортируемый стек.
  81.  * @param fieldType Тип поля, по которому нужно сортировать.
  82.  */
  83. void sortArchiveBySchoolSort(struct Stack *archiveStack, enum FieldType fieldType)
  84. {
  85.     struct Stack *left, *right;
  86.  
  87.     // Стек уже отсортирован, если в нём 1 или 0 элементов
  88.     if (StackLength(archiveStack) < 2)
  89.         return;
  90.  
  91.     left = archiveStack;
  92.     right = archiveStack->next;
  93.  
  94.     for (left = archiveStack; left->next != NULL; left = left->next) {
  95.         for (right = left->next; right != NULL; right = right->next) {
  96.             if (lessOrEqualThan((struct FlightInformation *)right->inf,
  97.                                 (struct FlightInformation *)left->inf,
  98.                                 fieldType)) {
  99.                 void *inf = left->inf;
  100.                 left->inf = right->inf;
  101.                 right->inf = inf;
  102.             }
  103.         }
  104.     }
  105. }
  106.  
  107. /**
  108.  * @brief Сортирует стек рейсов сортировкой вставкой по заданному полю.
  109.  * @param archiveStack Сортируемый стек.
  110.  * @param fieldType Тип поля, по которому нужно сортировать.
  111.  */
  112. void sortArchiveBySelectionSort(struct Stack *archiveStack, enum FieldType fieldType)
  113. {
  114.     struct Stack *left, *right;
  115.  
  116.     // Стек уже отсортирован, если в нём 1 или 0 элементов
  117.     if (StackLength(archiveStack) < 2)
  118.         return;
  119.  
  120.     left = archiveStack;
  121.     right = archiveStack->next;
  122.  
  123.     for (left = archiveStack; left->next != NULL; left = left->next) {
  124.         struct Stack *min = left;
  125.         for (right = left->next; right != NULL; right = right->next) {
  126.             if (lessOrEqualThan((struct FlightInformation *)right->inf,
  127.                                 (struct FlightInformation *)min->inf,
  128.                                 fieldType)) {
  129.                 min = right;
  130.             }
  131.         }
  132.  
  133.         if (min != left) {
  134.             void *inf = left->inf;
  135.             left->inf = min->inf;
  136.             min->inf = inf;
  137.         }
  138.     }
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement