Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- using namespace std;
- struct list {
- int val;
- list* prev = NULL;
- list* next = NULL;
- };
- struct list* init(int a) // создание корневого узла списка
- {
- list* lst = new list;
- lst->val = a;
- lst->prev = NULL; // указатель на предыдущий узел
- lst->next = NULL; // указатель на следующий узел
- return lst;
- }
- struct list* add_elem(list* lst, int a) { //добавление узла
- list* tmp = lst;
- while (tmp->next != NULL) {
- tmp = tmp->next;
- }
- tmp->next = new list();
- tmp->next->prev = tmp;
- tmp->next->val = a;
- return tmp;
- }
- struct list* delete_elem(list* lst) //удаление элемента из списка
- {
- struct list* prev;
- struct list* next;
- prev = lst->prev;
- next = lst->next;
- if (prev != NULL)
- prev->next = lst->next;
- if (next != NULL)
- next->prev = lst->prev;
- delete[](lst); // освобождаем память удаляемого элемента
- return(prev);
- }
- void printList(struct list* start, int size, ofstream& g) //вывод списка в файл
- {
- struct list* temp = start;
- for (int i = 0; i < size; i++) {
- g << temp->val << " ";
- temp = temp->next;
- }
- }
- void relax(list*& left, list*& right) {
- if (right != NULL) right->prev = left;
- if (left != NULL) left->next = right;
- }
- void swap(list*& a, list*& b) { //функция, меняющая два объекта местам
- relax(a->prev, b);
- relax(a, b->next);
- relax(b, a);
- }
- void bubbleSort(list* tmp, int size) {
- for (int i = 0; i < size; i++) {
- list* cur = tmp;
- for (int j = 0; j < size - 1 - i; j++) {
- if (cur->val > cur->next->val) {
- swap(cur->val, cur->next->val);
- cur = cur->next;
- } else {
- cur = cur->next;
- }
- }
- }
- }
- list* ind_elem(int x, list* Head) { // возврат элемента списка по его номеру
- list* lst = Head;
- for (int i = 0; i < x; ++i) {
- lst = lst->next;
- }
- return lst;
- }
- void quick_sort(list* Head, int left, int right) // быстрая сортировка
- {
- int pivot; // разрешающий элемент
- int l_hold = left;
- int r_hold = right;
- pivot = ind_elem(left, Head)->val;
- while (left < right) // пока границы не сомкнутся
- {
- while ((ind_elem(right, Head)->val >= pivot) && (left < right))
- right--;
- if (left != right) // если границы не сомкнулись
- {
- ind_elem(left, Head)->val = ind_elem(right, Head)->val;
- left++;
- }
- while ((ind_elem(left, Head)->val <= pivot) && (left < right))
- left++;
- if (left != right) // если границы не сомкнулись
- {
- ind_elem(right, Head)->val = ind_elem(left, Head)->val;
- right--;
- }
- }
- ind_elem(left, Head)->val = pivot; // ставим разрешающий элемент на место
- pivot = left;
- left = l_hold;
- right = r_hold;
- if (left < pivot) // рекурсивно вызываем сортировку для левой и правой части массива
- quick_sort(Head, left, pivot - 1);
- if (right > pivot)
- quick_sort(Head, pivot + 1, right);
- }
- int main() {
- setlocale(LC_ALL, "Rus");
- ifstream in("input.txt"); //создание файловых потоков
- ofstream out("output.txt");
- int sort = 0, head, size, a;
- in >> sort >> head;
- list* list;
- list = init(head);
- size = 1;
- while (in >> a) {
- add_elem(list, a);
- ++size;
- }
- out << size << ' ';
- if (sort == 0)
- quick_sort(list, 0, size - 1);
- if (sort == 1)
- bubbleSort(list, size);
- printList(list, size, out);
- delete_elem(list);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement