- •1. Методы оценки сложности и эффективности алгоритмов и структур данных.
- •2. Линейный однонаправленный список, представление и реализация.
- •3. Стек, очередь и дек.
- •4.Мультисписки. Слоеные списки. Иерархические списки.
- •5.Нотации алгебраических выражений.
- •6. Поиск в линейных структурах данных (последовательный поиск, барьеры, бинарный поиск, метод интерполяций)
- •7. Хеширование при хранении и поиске данных. Возникновение и разрешение коллизий.
- •8. Представления и реализации бинарных деревьев, обходы бинарных деревьев.
- •9. Бинарные деревья поиска.
- •10. Алгоритмы построения идеально сбалансированного дерева. Алгоритм построения лозы бинарного дерева.
- •Int* keys; // An array of keys
- •Int t; // Minimum degree (defines the range for number
- •Int n; // Current number of keys
- •13. Графы, способы представления.
- •14. Сортировка вставками (включением),сортировка Шелла.
- •15. Сортировка обменами, шейкерная сортировка.
- •16.Сортировка выбором.
- •17. Сортировка подсчетом. (Требуется проверка)
- •18. Быстрая сортировка Хоара.
- •19. Карманная сортировка, поразрядная сортировка.
- •20. Турнирная сортировка.
- •21. Пирамидальная сортировка.
- •22. Внешняя сортировка, прямое слияние, естественное слияние.
- •23. Алгоритмы поиска в тексте.Прямой поиск, алгоритм Рабина-Карпа
- •24. Алгоритмы поиска в тексте, алгоритм Боуера-Мура.
- •25. Файловые структуры данных. Классификация файлов. Индексные файлы. Инвертированные списки.
15. Сортировка обменами, шейкерная сортировка.
Сортирова обменами (пузырьковая):
Простая сортировка, суть которой заключается в циклическом сравнении пар элементов и их обменом, если левый сравниваемые элемент больше правого. гарантируется, что за первую итерацию в конце массива будет расположен максимальный элемент
void bubblesort(int* arr, int size)
{
bool flag = true;
int right = size-1;
while (flag)
{
flag = false;
for(int i = 0; i < right; ++i)
if (arr[i] > arr[i + 1])
{
flag = true;
std::swap(arr[i], arr[i+1]);
}
–right;
}
}
лучший случай: O(N)
средний случай: О( )
Шейкерная сортировка:
Является улучшенной версией сортировки пузырьком. улучшение проявляется за счет второго цикла, который проходит массив с конца, тем самым гарантируя, что за первый проход в начале и в конце будут находиться минимальный и максимальный элемент соответственно
void shackersort(int* arr, int size)
{
bool flag = true;
int left = 0, right = size - 1;
while (flag)
{
flag = false;
for(int i = left; i <= right; ++i)
if (arr[i] > arr[i + 1])
{
flag = true;
std::swap(arr[i], arr[i + 1]);
}
++left;
for(int i = right; i >= left; --i)
if(arr[i] < arr[i-1])
{
flag = true;
std::swap(arr[i], arr[i - 1]);
}
--right;
}
}
лучший случай: O(N)
средний случай: О( )
16.Сортировка выбором.
Принцип работы сортировки заключается в поиске минимального элемента и обменом с неотсортированным началом массива
void selectionsort(int* arr, int size)
{
int min_idx;
for (int i = 0; i < size - 1; i++)
{
min_idx = i;
for (int j = i + 1; j < size; j++)
if (arr[j] < arr[min_idx])
min_idx = j;
std::swap(arr[min_idx], arr[i]);
}
}
17. Сортировка подсчетом. (Требуется проверка)
Принцип состоит в том, что в алгоритме не производятся сравнения, вместо этого заводится массив с количеством уникальных значений, после чего исходный массив заменяется… (короче гифка)
Входной массив должен иметь небольшой разброс с неотрицательными значениями.
void countsort(int *array, int size)
{
unsigned int min, max;
max = min = array[0];
for (int i = 1; i < size; i++)
{
if (array[i] < min)
min = array[i];
if (array[i] > max)
max = array[i];
}
int *counts = new int [max - min + 1];
int count_size = max - min + 1;
for (int i = 0; i < count_size; ++i)
counts[i] = 0;
for (int i = 0; i < size; i++)
counts[array[i] - min]++;
int index = 0;
for (int i = 0; i < count_size; i++)
for (int j = 0; j < counts[i]; j++)
array[index++] = i + min;
}
Сложность: O(n + k) // не понял, что такое k (прим. k - размер вспомогательного массива, количество уникальных значений)