- •1. Основы теории сложности. Классы сложности np и p.
- •2. Сортировка и поиск . Проверка упорядоченности массива. Способы сортировки.
- •3.Обменная сортировка (метод "пузырька", шейкер-сортировка)
- •4. Сортировка разделением (быстрая сортировка). Распределяющая сортировка.
- •5. Сортировка подсчётом. Сортировка выбором (прямой выбор, линейный выбор, квадратичная )
- •7. Пирамидальная сортировка. Сортировка слиянием (однократное и циклическое)
- •8. Стек. Основные базисные операции для работы со стеком. Организация стека на основе массива и связного списка.
- •9. Очередь. Основные операции для работы с очередью
- •10. Очередь с приоритетом. Основные операции для работы с очередью с приоритетом.
- •11. Деки. Логическая структура дека.
- •12. Списки как динамические структуры данных. Виды линейных списков. Способы формирования односвязных списков. Оценка сложности.
- •13. Односвязный список. Включение элемента в начало списка. Удаление элемента из списка по заданному номеру.
- •14. Односвязный список. Включение элемента в конец списка. Слияние 2 списков.
- •15. Двухсвязный список. Удаление и вставка элемента в список.
- •16. Циклические списки. Просмотр циклического списка.
- •17. Мультисписки. Нелинейные разветвлённые списки.
- •18. Особенности программирования рекурсивных функций. Линейная рекурсия (пример).
- •19. Смешанная, ветвящаяся и бинарная рекурсия. (примеры)
- •20. Рекурсия и поисковые задачи. Результат функции рекурсивного поиска, возврат последовательности, правила разработки.
- •21. Рекурсия и поисковые задачи. Ханойские башни. Генераторы перестановок, сортировки, алгоритмы с матрицами и др.
- •22. Деревья как рекурсивные структуры данных. Основные определения и свойства. Логическое представление и изображение деревьев.
- •23. Бинарные деревья. Вставка элемента
- •24. Бинарные деревья. Удаление элемента
- •25. Бинарные деревья. Поиск . Алгоритм представления любого дерева и леса бинарными деревьями.
- •26. Способы обхода бинарного дерева: нисходящий, восходящий, смешанный.
- •28. Сбалансированные деревья. Показатель сбалансированности. Avl-деревья.
- •29.Виды балансировки деревьев. Балансировка через массив.
- •30. Красно-чёрные деревья.
- •31. Приложения деревьев.Дерево Хаффмана. (оставь здесь 10 шрифт!!!)
- •32. Бинарная куча. Проверка основного свойства кучи.
- •33. Бинарная куча. Определение родительской и дочерних вершин.
- •34. Бинарнаякуча. Алгоритм построения кучи из произвольного массива.
- •36. Бинарная куча. Добавление элемента.
- •39. Алгоритмы вычисления хэш-функции.
- •44. Задача поиска подстрок, простейший алгоритм.
- •47. Методы разработки алгоритмов. Метод декомпозиции, динамическое программирование
- •48. Методы разработки алгоритмов. Жадные алгоритмы, поиск с возвратом, локальный поиск.
13. Односвязный список. Включение элемента в начало списка. Удаление элемента из списка по заданному номеру.
Односвязные списки являются наиболее простыми. Основным их недостатком является возможность просмотра только в одном направлении - от начала к концу. Без дополнительных "ухищрений" нельзя получить указатель на предыдущий элемент списка, который необходим при удалении текущего. Для односвязного списка наиболее простыми являются операции включения и исключения элементов в начале и конце списка, соответственно они используются для моделирования таких структур данных, как стеки и очереди.
//-------Вставка элемента в начало списка
list* insert_(list*ph,int v)
{
list *pr,*p,*pn;
for(pr=NULL,p=ph; p!=NULL && p->vv < v; pr=p,p=p->next);
pn=new list;
pn->vv = v;
pn->next=NULL;
if(pr==NULL)
ph=pn;
else
pr->next=pn;
pn->next=p;
return ph;
}
//-------- Удаление элемента списка по заданному логическому номеру
list *Remove(list *&pp, int n)
{ list *q; // Указатель на текущий элемент
for (q = pp; q!=NULL && n!=0; q = q->next, n--); // Отсчитать n -ый
if (q==NULL) return NULL; // нет элемента с таким номером
if (q->prev==NULL) // удаление первого -
pp=q->next; // коррекция заголовка
else q->prev->next = q->next; // следующий для предыдущего =
// следующий за текущим
if (q->next!=NULL) // удаление не последнего -
q->next->prev = q->prev; // предыдущий для следующего =
return q; } // предыдущий текущего
14. Односвязный список. Включение элемента в конец списка. Слияние 2 списков.
Односвязные списки являются наиболее простыми. Основным их недостатком является возможность просмотра только в одном направлении -от начала к концу. Без дополнительных "ухищрений" нельзя получить указатель на предыдущий элемент списка, который необходим при удалении текущего. Для односвязного списка наиболее простыми являются операции включения и исключения элементов в начале и конце списка, соответственно они используются для моделирования таких структур данных, как стеки и очереди.
// Включение в конец списка
void In(list *&ph,int v){
list *q=new list;
q->next=NULL;
q->val=v;
if (ph==NULL) ph=q; // список пуст - единственный
else{ // цикл поиска конца списка
for (list *p=ph; p->next!=NULL; p=p->next);
p->next=q; // следующий за последним - новый
}}
Слияние двух списков.
Операция слияния заключается в формировании из двух списков одного - она аналогична операции сцепления строк. Последний элемент первого списка содержит пустой указатель на следующий элемент, этот указатель служит признаком конца списка. Вместо этого пустого указатель в последний элемент первого списка заносится указатель на начало второго списка. Таким образом, второй список становится продолжением первого.