
- •Понятие сложности алгоритма, оценки времени исполнения.
- •Общая классификация вычислительных алгоритмов.
- •Точность представления чисел.
- •Вычисление «машинного нуля».
- •Понятие стека. Операции над стеком.
- •Программная реализация стека на основе статического массива.
- •Использование стека при организации связи функций в языке Си и в ос.
- •Понятие очереди. Операции над очередями.
- •Кольцевая очередь. Деки.
- •Программная реализация очереди на основе статического массива.
- •Структура данных «список».
- •Ссылки.
- •Линейные списки – основные операции.
- •Реализ списков на основе динам стру.
- •Двусвязный список и его программная реализация.
- •Кольцевые списки.
- •Многосвязные (слоеные) списки.
- •Бинарный поиск.
- •Алгоритм прямого поиска.
- •Алгоритм Кнута-Мориса-Пратта.
- •Алгоритм Боуера-Мура.
- •Сортировки – общая классификация.
- •Сортировка с помощью включения.
- •Сортировка с помощью выделения
- •Сортировка с помощью обменов
- •Шейкерная сортировка
- •Сортировка Шелла
- •Сравнение рассмотренных сортировок
- •Пирамидальная сортировка
- •Быстрая сортировка.
- •Сортировка слиянием
- •Графы – основные понятия.
- •Формы представления графов. Матрица смежности
- •Матрица инцидентности
- •Списки смежности
- •Массив дуг
- •Достижимость и обходы графа
- •Алгоритм Дейкстры
- •[30, 1] Постоянная
- •[40, 3] Постоянная
- •Вычисление выражений по их символьному представлению.
- •Построение обратной польской записи выражения.
Сортировка с помощью включения.
Элементы мысленно делятся на уже готовую последовательность (от a0 до ai) и исходную. На кажд шаге, начиная с первого, i увеличив на 1, из исходн. последовательнос извлекается i-ый эл-т и перекладывается в готовую послед-ть, при этом он вставл-ся на нужное место.
i = 1 44 55 12 42 94 18 06 67
i = 2 44 55 12 42 94 18 06 67
i = 3 12 44 55 42 94 18 06 67
i = 4 12 42 44 55 94 18 06 67
i = 5 12 42 44 55 94 18 06 67
i = 6 12 18 42 44 55 94 06 67
i = 7 06 12 18 42 44 55 94 67
i = 8 06 12 18 42 44 55 67 94
Вставка эл-та на очередн.шаге осуществляется путем последоват. сравнений с эл-том, стоящим перед ним.
void insertSort(int* a, long size) {
int x;
long i, j;
for(i =0; i < size; i++) {
x = a[i];
for ( j = i-1; j >= 0 && a[j] > x; j--)
a[j+1] = a[j];
a[j+1] = x; } }
Сортировка с помощью выделения
Описание:
Выбирается min-ый эл-т
Он меняется местами с 1-ым эл-том
Этот процесс повторяется с оставшимися элементами
void selectSort(int* a, long size) {
int x, minE, minP;
long i, j;
for(i=0; i < size; i++) {
x = a[i];
minE = 0;
for(j = i; j < size; j++)
if(a[j] < minE)
{ minE = a[j]; minP = j; }
a[i] = minE;
a[minP] = x; } }
Сортировка с помощью обменов
Идея: проход снизу вверх по массиву. По пути просматриваются пары соседних эл-тов. Если эл-ты некоторой пары находятся в неправильном порядке, они меняются местами.
Следующий проход делается до второго сверху эл-та и т.д, проходы по уменьшающейся нижней части делаются до тех пор, пока там не останется один эл-т
void bubbleSort(int a[], long size)
{
long i, j;
int x;
for(i = 0; i < size; i++) { // i - номер прохода
for(j = size-1; j > i; j--) {
if ( a[j-1] > a[j] ) {
x=a[j-1]; a[j-1]=a[j]; a[j]=x; }
} } }
Шейкерная сортировка
Для улучшения пузырьковой сортировки можно запоминать, были ли перестановки в процессе последнего прохода. Если нет, заканчивать работу.
Это улучшение можно еще улучшить, если запомнить не только сам факт обмена, но и индекс последнего обмена.
Все пары соседних элементов выше этого индекса находятся в желаемом порядке, поэтому просмотры можно заканчивать на этом индексе, а не идти до заранее определенного нижнего предела.
Анализируя алгоритм, можно заметить некоторую асимметрию: всплывает пузырек сразу за один проход, а тонет очень медленно на одну позицию за проход. Поэтому появляется идея третьего улучшения: чередовать направление последовательных просмотров (сначала min вверх, а max вниз)
Сортировка Шелла
В 1959г. Шелл усовершенствовал сортировку вставкой.
Сначала отдельно группируются и сортируются эл-ты, отстоящие друг от друга на половину размера массива – на 4.
44 55 12 42 94 18 06 67
44 18 06 42 94 55 12 67
На втором шаге перегруппировываются группы отстоящие друг от друга на две позиции
06 18 12 42 44 55 94 67
На последнем шаге обычная сортировка включением
06 12 18 42 44 55 67 94
void sort_shell(int *a,int N) {
for(int d=N/2; d > 0; d/=2)
for(int i=d; i < N; i++)
for(int j = i; j>=d && a[j - d] > a[j]; j -= d)
swap(a[j], a[j-d]);
}