
- •Какие типы данных Вы знаете?
- •Как узнать размер типа?
- •Что такое модель памяти? Какие модели памяти Вы знаете?
- •Назовите размеры стандартных типов в используемой Вами модели памяти.
- •Что такое оператор typedef?
- •Для чего предназначена директива препроцессора #define?
- •Что такое сигнатура функции?
- •Что означает директива #include?
- •Что такое #if, #ifdef, #endif? Приведите пример применения.
- •Как можно выделить память?
- •Как можно освободить память?
- •Как проверить, что память выделилась?
- •Как создать массив на стеке? Любой ли массив можно создать на стеке?
- •Что такое "выделение памяти в куче"?
- •Что такое очередь? Как она устроена? Какие операции в ней есть?
- •Что такое куча (пирамида, Heap)?
- •2. "Двусвязный список"
- •3. Задача сортировки n объектов.
- •6. Атд "Очередь с приоритетом"
- •7. Поразрядная сортировка
- •8. Сортировка слиянием
- •9. Сортировка Шелла.
- •10. Список, стек, очередь
- •11. Быстрая сортировка-2
8. Сортировка слиянием
Какова сложность этого алгоритма? Каковы затраты памяти?
Сложность O(n log n); требуется O(n) дополнительной памяти;
Напишите код слияния отсортированных подмассивов.
Выстраиваем первую и вторую половину списка отдельно, а затем — сливаем упорядоченные списки
void merge(int *a, int l, int m, int r)
{
int i = l, j=m+1, k=0;
int *b=(int*)malloc((r - l + 1) * sizeof(int));
while ((i <= m) && (j <= r))
{
if (a[i] < a[j])
b[k++] = a[i++];
else
b[k++] = a[j++];
}
while (i <= m)
b[k++] = a[i++];
while (j <= r)
b[k++] = a[j++];
memcpy(a + l, b, (r - l + 1) * sizeof(int));
free(b);
}
9. Сортировка Шелла.
Идея сортировки.
Cначала сравниваются и сортируются между собой значения, отстоящие один от другого на некотором расстоянии d. После этого процедура повторяется для некоторых меньших значений d, а завершается сортировка упорядочиванием элементов при d = 1.
Преимущества:
отсутствие потребности в памяти под стек;
отсутствие деградации при неудачных наборах данных — быстрая сортировка легко деградирует до O(n²), что хуже, чем худшее гарантированное время для сортировки Шелла.
Лемма об h-сортировке k-упорядоченного файла.
После h-сортировки k-упорядоченный файл остается k-упорядоченным.
Таким образом, файл, который был сначала 7-отсортирован, а потом 5-отсортирован, становится одновременно 7- и 5-упорядоченным.
Популярные последовательности.
Последовательности и их сложность:
Шелла: d1=N/2 di=di-1/2 dk=1 O(cn2)
Хиббард: все (2i-1)/2 <= n/2 O(n3/2)
Пратт: все 2i*3j<=n/2 O(n (log n)2 )
10. Список, стек, очередь
Что такое стек?
Стек — структура данных, в которой доступ к элементам организован по принципу «последним пришёл — первым вышел». Чаще всего принцип работы стека сравнивают со стопкой тарелок: чтобы взять вторую сверху, нужно снять верхнюю.
Что такое очередь?
О́чередь — структура данных с дисциплиной доступа к элементам «первый пришёл — первый вышел». Добавление элемента возможно лишь в конец очереди, выборка — только из начала очереди, при этом выбранный элемент из очереди удаляется.
Как эти типы данных можно реализовать?
Стек в виде односвязного списка:
struct MyStackIterator { struct MyStackIterator *Last; /*<Указатель на предыдущий элемент в стеке.*/ MyStackType Value; /*<Значение.*/ }; struct MyStack {/*<Структура описывающая стек.*/ struct MyStackIterator *TopIter; /*<Указатель на последний элемент в стеке.*/ };
Очередь:
struct MyStackIterator { struct MyStackIterator *Last; /*<Указатель на предыдущий элемент в очереди.*/ MyStackType Value; /*<Значение.*/ }; struct MyStack {/*<Структура описывающая стек.*/ struct MyStackIterator *TopIter; /*<Указатель на последний элемент в очереди.*/ struct MyStackIterator *LowIter; /*<Указатель на первый элемент в очереди. Который будет удаляться.*/ };
11. Быстрая сортировка-2
Базовый алгоритм
Стратегия «разделяй и властвуй». Шаги алгоритма таковы:
Выбираем в массиве опорный элемент. Для повышения эффективности алгоритма выбираться должна медиана. Известные стратегии: выбирать постоянно один и тот же элемент; выбирать элемент со случайным индексом.
Операция разделения массива: реорганизуем массив таким образом, чтобы все элементы, меньшие или равные опорному элементу, оказались слева от него, а все элементы, большие опорного — справа . Обычный алгоритм операции:
Два индекса — l и r, приравниваются к минимальному и максимальному индексу разделяемого массива соответственно.
Вычисляется индекс опорного элемента m.
Индекс l последовательно увеличивается до m до тех пор, пока l-й элемент не превысит опорный.
Индекс r последовательно уменьшается до m до тех пор, пока r-й элемент не окажется меньше либо равен опорному.
Если r = l — найдена середина массива — операция разделения закончена, оба индекса указывают на опорный элемент.
Если l < r — найденную пару элементов нужно обменять местами и продолжить операцию разделения с тех значений l и r, которые были достигнуты. Следует учесть, что если какая-либо граница (l или r) дошла до опорного элемента, то при обмене значение m изменяется на r-й или l-й элемент соответственно.
Рекурсивно упорядочиваем подмассивы, лежащие слева и справа от опорного элемента.
Базой рекурсии являются наборы, состоящие из одного или двух элементов. Первый возвращается в исходном виде, во втором, при необходимости, сортировка сводится к перестановке двух элементов. Все такие отрезки уже упорядочены в процессе разделения.
Поскольку в каждой итерации (на каждом следующем уровне рекурсии) длина обрабатываемого отрезка массива уменьшается, по меньшей мере, на единицу, терминальная ветвь рекурсии будет достигнута всегда и обработка гарантированно завершится.
Докажите сложность алгоритма быстрой сортировки
фото
Можно ли сделать более быструю сортировку?
Минимальная сложность quick sort – O (n log n) В принципе более быстрые реализации сортировки существуют. Пример: поразрядная сортировка