Advertisement
999ms

lab huyab

Mar 16th, 2021
876
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.83 KB | None | 0 0
  1.  
  2. #include <iostream>
  3. #include <fstream>
  4.  
  5. using namespace std;
  6.  
  7. struct list {
  8.     int val;
  9.     list* prev = NULL;
  10.     list* next = NULL;
  11. };
  12.  
  13. struct list* init(int a) // создание корневого узла списка
  14. {
  15.     list* lst = new list;
  16.     lst->val = a;
  17.     lst->prev = NULL; // указатель на предыдущий узел
  18.     lst->next = NULL; // указатель на следующий узел
  19.     return lst;
  20. }
  21.  
  22. struct list* add_elem(list* lst, int a) {        //добавление узла
  23.     list* tmp = lst;
  24.   while (tmp->next != NULL) {
  25.     tmp = tmp->next;
  26.   }
  27.   tmp->next = new list();
  28.   tmp->next->prev = tmp;
  29.   tmp->next->val = a;
  30.   return tmp;
  31. }
  32.  
  33. struct list* delete_elem(list* lst)                   //удаление элемента из списка
  34. {
  35.     struct list* prev;
  36.     struct list* next;
  37.     prev = lst->prev;
  38.     next = lst->next;
  39.     if (prev != NULL)
  40.         prev->next = lst->next;
  41.     if (next != NULL)
  42.         next->prev = lst->prev;
  43.     delete[](lst);                                   // освобождаем память удаляемого элемента
  44.     return(prev);
  45. }
  46.  
  47. void printList(struct list* start, int size, ofstream& g)       //вывод списка в файл
  48.  
  49. {
  50.     struct list* temp = start;
  51.   for (int i = 0; i < size; i++) {
  52.         g << temp->val << " ";
  53.         temp = temp->next;
  54.     }
  55.  
  56. }
  57.  
  58. void relax(list*& left, list*& right) {
  59.     if (right != NULL) right->prev = left;
  60.     if (left != NULL) left->next = right;
  61. }
  62.  
  63. void swap(list*& a, list*& b) {                 //функция, меняющая два объекта местам
  64.   relax(a->prev, b);
  65.   relax(a, b->next);
  66.   relax(b, a);
  67. }
  68.  
  69. void bubbleSort(list* tmp, int size) {
  70.   for (int i = 0; i < size; i++) {
  71.     list* cur = tmp;
  72.     for (int j = 0; j < size - 1 - i; j++) {
  73.       if (cur->val > cur->next->val) {
  74.         swap(cur->val, cur->next->val);
  75.         cur = cur->next;
  76.       } else {
  77.         cur = cur->next;
  78.       }
  79.     }
  80.   }
  81. }
  82.  
  83.  
  84.  
  85. list* ind_elem(int x, list* Head) {                             // возврат элемента списка по его номеру
  86.     list* lst = Head;
  87.     for (int i = 0; i < x; ++i) {
  88.         lst = lst->next;
  89.     }
  90.     return lst;
  91. }
  92.  
  93. void quick_sort(list* Head, int left, int right)                // быстрая сортировка
  94. {
  95.     int pivot;                                                  // разрешающий элемент
  96.     int l_hold = left;
  97.     int r_hold = right;
  98.     pivot = ind_elem(left, Head)->val;
  99.  
  100.     while (left < right)                                        // пока границы не сомкнутся
  101.     {
  102.         while ((ind_elem(right, Head)->val >= pivot) && (left < right))
  103.             right--;
  104.         if (left != right)                                      // если границы не сомкнулись
  105.         {
  106.             ind_elem(left, Head)->val = ind_elem(right, Head)->val;
  107.             left++;
  108.         }
  109.         while ((ind_elem(left, Head)->val <= pivot) && (left < right))
  110.             left++;
  111.         if (left != right)                                      // если границы не сомкнулись
  112.         {
  113.             ind_elem(right, Head)->val = ind_elem(left, Head)->val;
  114.             right--;
  115.         }
  116.     }
  117.  
  118.  
  119.     ind_elem(left, Head)->val = pivot;                          // ставим разрешающий элемент на место
  120.     pivot = left;
  121.     left = l_hold;
  122.     right = r_hold;
  123.  
  124.     if (left < pivot)                                           // рекурсивно вызываем сортировку для левой и правой части массива
  125.         quick_sort(Head, left, pivot - 1);
  126.     if (right > pivot)
  127.         quick_sort(Head, pivot + 1, right);
  128. }
  129.  
  130.  
  131. int main() {
  132.     setlocale(LC_ALL, "Rus");
  133.     ifstream in("input.txt");                                   //создание файловых потоков
  134.     ofstream out("output.txt");
  135.     int sort = 0, head, size, a;
  136.     in >> sort >> head;
  137.     list* list;
  138.     list = init(head);
  139.     size = 1;
  140.   while (in >> a) {
  141.         add_elem(list, a);
  142.         ++size;
  143.     }
  144.  
  145.     out << size << ' ';
  146.     if (sort == 0)
  147.         quick_sort(list, 0, size - 1);
  148.     if (sort == 1)
  149.         bubbleSort(list, size);
  150.  
  151.     printList(list, size, out);
  152.     delete_elem(list);
  153.     return 0;
  154. }
  155.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement