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

    • Какова сложность этого алгоритма? Каковы затраты памяти?

    • Напишите код слияния отсортированных подмассивов.

Сложность алгоритма: 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);

}

  1. Сортировка Шелла.

    • Идея сортировки.

    • Лемма об h-сортировке k-упорядоченного файла.

    • Популярные последовательности.

Cначала сравниваются и сортируются между собой значения, отстоящие один от другого на некотором расстоянии d. После этого процедура повторяется для некоторых меньших значений d, а завершается сортировка упорядочиванием элементов при d = 1.

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

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

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

  1. Список, стек, очередь

    • Что такое стек?

    • Что такое очередь?

    • Как эти типы данных можно реализовать?

Стек (англ. stack — стопка) — структура данных, в которой доступ к элементам организован по принципу LIFO (англ. last infirst 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;        /*<Указатель на первый элемент в очереди. Который будет удаляться.*/

};

  1. Быстрая сортировка-2

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

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

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