Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
teorminimum.docx
Скачиваний:
3
Добавлен:
26.11.2019
Размер:
84.45 Кб
Скачать

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.

Преимущества:

  1. отсутствие потребности в памяти под стек;

  2. отсутствие деградации при неудачных наборах данных — быстрая сортировка легко деградирует до 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

  • Базовый алгоритм

Стратегия «разделяй и властвуй». Шаги алгоритма таковы:

    1. Выбираем в массиве опорный элемент. Для повышения эффективности алгоритма выбираться должна медиана. Известные стратегии: выбирать постоянно один и тот же элемент; выбирать элемент со случайным индексом.

    2. Операция разделения массива: реорганизуем массив таким образом, чтобы все элементы, меньшие или равные опорному элементу, оказались слева от него, а все элементы, большие опорного — справа . Обычный алгоритм операции:

  • Два индекса — l и r, приравниваются к минимальному и максимальному индексу разделяемого массива соответственно.

  • Вычисляется индекс опорного элемента m.

  • Индекс l последовательно увеличивается до m до тех пор, пока l-й элемент не превысит опорный.

  • Индекс r последовательно уменьшается до m до тех пор, пока r-й элемент не окажется меньше либо равен опорному.

  • Если r = l — найдена середина массива — операция разделения закончена, оба индекса указывают на опорный элемент.

  • Если l < r — найденную пару элементов нужно обменять местами и продолжить операцию разделения с тех значений l и r, которые были достигнуты. Следует учесть, что если какая-либо граница (l или r) дошла до опорного элемента, то при обмене значение m изменяется на r-й или l-й элемент соответственно.

    1. Рекурсивно упорядочиваем подмассивы, лежащие слева и справа от опорного элемента.

    2. Базой рекурсии являются наборы, состоящие из одного или двух элементов. Первый возвращается в исходном виде, во втором, при необходимости, сортировка сводится к перестановке двух элементов. Все такие отрезки уже упорядочены в процессе разделения.

Поскольку в каждой итерации (на каждом следующем уровне рекурсии) длина обрабатываемого отрезка массива уменьшается, по меньшей мере, на единицу, терминальная ветвь рекурсии будет достигнута всегда и обработка гарантированно завершится.

  • Докажите сложность алгоритма быстрой сортировки

фото

  • Можно ли сделать более быструю сортировку?

Минимальная сложность quick sort – O (n log n) В принципе более быстрые реализации сортировки существуют. Пример: поразрядная сортировка

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]