- •2. Структуры данных. Элементарные данные.
- •3. Линейные структуры данных. Массив.
- •4. Линейные структуры данных. Запись.
- •5. Линейные структуры данных. Множество.
- •6. Линейный однонаправленный список. Способы реализации и основные операции.
- •7. Линейный двунаправленный список. Способы реализации и основные операции.
- •8. Циклический однонаправленный список. Способы реализации и основные операции.
- •9. Циклический двунаправленный список. Способы реализации и основные операции.
- •10. Стек. Способы реализации и основные операции.
- •11. Очередь. Способы реализации и основные операции.
- •12. Дек. Способы реализации и основные операции.
- •13. Мультисписки. Способы реализации и основные операции.
- •14. Слоёные списки. Способы реализации и основные операции.
- •15. Графы. Способы реализации и основные операции.
- •16. Общие сведения о деревьях. Двоичные деревья. Основные определения и способы реализации.
- •17. Обходы деревьев.
- •18. Организация файлов. Общие сведения.
- •21. Методы разработки алгоритмов
- •22. Алгоритмы поиска в линейных структурах. Последовательный (линейный) поиск
- •23. Алгоритмы поиска в линейных структурах. Бинарный поиск
- •24. Хеширование данных. Функция хеширования
- •25. Хеширование данных. Открытое хеширование
- •26. Хеширование данных. Закрытое хеширование
- •27. Поиск данных по вторичным ключам
- •28. Упорядоченные деревья поиска. Способы реализации и основные операции
- •29. Случайные деревья поиска и оптимальные деревья поиска. Основные понятия
- •31. Поиск в тексте. Прямой поиск
- •32. Поиск в тексте. Алгоритм Кнута, Мориса и Пратта
- •33. Поиск в тексте. Алгоритм Боуера и Мура
- •34. Общие сведения об алгоритмах кодирования (сжатия) данных. Метод Хаффмана
- •35. Алгоритм внутренней сортировки подсчетом
- •36. Алгоритм внутренней сортировки простым включением
- •37. Алгоритм внутренней сортировки простым извлечением
- •38. Алгоритм внутренней сортировки методом пузырька
- •39. Алгоритм внутренней быстрой сортировки (Хоара)
- •40. Алгоритм внутренней сортировки слиянием
- •41. Алгоритм внутренней сортировки распределением
- •42. Алгоритмы внешней сортировки
- •43. Алгоритм определения циклов в графе
- •45. Алгоритмы обхода графа. Поиск в ширину (Волновой алгоритм)
- •46. Алгоритмы нахождения кратчайшего пути в графе. Алгоритм Дейкстры
- •47. Алгоритмы нахождения кратчайшего пути в графе. Алгоритм Флойда
- •49. Алгоритмы нахождения минимального остовного дерева графа. Алгоритм Крускала
35. Алгоритм внутренней сортировки подсчетом
2.5.2.1. Сортировка подсчетом Суть мечода заключается в том, что на каждом шаге подсчитывается, в какую позицию результирующего массива В надо записать очередной элемент исходного массива А (рис. 40). Если некоторый элемент А[~] помещается в результирующий массив в позицию k + 1, то слева от B[k+ 1] должны стоять элементы меньшие или равные B[k+ 1]. Значит, число k складывается из количества элементов меньших A[i] и, возможно, некоторого числа элементов, равных A[i]. Условимся, что из равных будут учитываться толью те элементы, которые в исходном массиве стоят левее A[i]: Легко видеть, что этот алгоритм всегда имеет временную сложность, пропорциональную O(n2) (два вложенных цикла, зависящих от и линейно и не зависящих от порядка элементов) и пространственную сложность, пропорциональную 0(л) (результирующий массив). Также следует отметить, что данный алгоритм сохраняет порядок элементов с одинаковыми значениями.
36. Алгоритм внутренней сортировки простым включением
2.5.2.2. Сортировка простым включением В этой сортировке массив делится на две части: отсортированную и неотсортированную. На каждом шаге берется очередной элемент из неотсортированной части и «включается» в отсортированную часть массива (рис. 41). Пусть отсортировано начало массива А[1], А[2], A[i-1], а остаток массива A[i], А[л] содержит неотсортированную часть. На очередном шаге будем включать элемент А[т] в отсортированную часть, ставя его на соответствующее место. При этом придется сдвинуть часть элементов, больших A[i), (если таковые есть) на одну позицию правее, чтобы освободить место для элемента А[т]. Но при сдвиге будет потеряно само значение A[i], поскольку в эту позицию запишется первый (самый правый - с самым большим индексом) сдвигаемый элемент. Поэтому прежде чем производить сдвиг элементов необходимо сохранить значение A[i] в промежуточной переменной. Этот алгоритм также имеет максимальную и среднюю временную сложности, пропорциональные O(n2), но в случае исходно отсортированного массива внутренний цикл не будет выполняться ни разу, поэтому метод имеет временную сложность Т (n), пропорциональную O(n). Можно заметить, что метод использует любой частичный порядок, и чем в большей степени массив исходно упорядочен, тем быстрее он закончит работу. В отличие оч предыдущего метода, э'пл не требует дополнительной памяти, но сохраняет порядок элементов с одинаковыми значениями.
37. Алгоритм внутренней сортировки простым извлечением
В
этом методе массив также делится на уже
отсортированную часть A[i+1], A[i+1], А[л] и
еще не отсортированную А[1], А[2], A[i]. Но
здесь из неотсортированной части на
каждом шаге извлекается максимальный
элемент, просматривая ее заново на
каждом шаге. Этот элемент будет минимальным
элементом отсортированной части, так
как все большие его элементы были
извлечены на предыдущих шагах, поэтому
ставим извлеченный элемент в начало
отсортированной части, точнее меняем
его с A[i] местами (рис. 43).
Простое
извлечение во всех случаях имеет
временную сложность, пропорциональную
O(n2) (два вложенных цикла, зависящих от
и линейно и не зависящих от порядка
элементов). Также следует отметить, что
данный алгоритм не требует дополнительной
памяти и не гарантирует сохранение
порядка элементов с одинаковыми
значениями.
