Сортировка слиянием
Какова сложность этого алгоритма? Каковы затраты памяти?
Напишите код слияния отсортированных подмассивов.
Сложность алгоритма: 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);
}
Сортировка Шелла.
Идея сортировки.
Лемма об h-сортировке k-упорядоченного файла.
Популярные последовательности.
Cначала сравниваются и сортируются между собой значения, отстоящие один от другого на некотором расстоянии d. После этого процедура повторяется для некоторых меньших значений d, а завершается сортировка упорядочиванием элементов при d = 1.
Преимущества:
отсутствие потребности в памяти под стек;
отсутствие деградации при неудачных наборах данных — быстрая сортировка легко деградирует до O(n²), что хуже, чем худшее гарантированное время для сортировки Шелла.
После 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 )
Список, стек, очередь
Что такое стек?
Что такое очередь?
Как эти типы данных можно реализовать?
Стек (англ. stack — стопка) — структура данных, в которой доступ к элементам организован по принципу LIFO (англ. last in — first out, «последним пришёл — первым вышел»). Чаще всего принцип работы стека сравнивают со стопкой тарелок: чтобы взять вторую сверху, нужно снять верхнюю.
О́чередь — структура данных с дисциплиной доступа к элементам «первый пришёл — первый вышел». Добавление элемента возможно лишь в конец очереди, выборка — только из начала очереди, при этом выбранный элемент из очереди удаляется.
Стек в виде односвязного списка
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; /*<Указатель на первый элемент в очереди. Который будет удаляться.*/
};
Быстрая сортировка-2
Базовый алгоритм
Докажите сложность алгоритма быстрой сортировки
Можно ли сделать более быструю сортировку?