Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмы и структуры данных.doc
Скачиваний:
81
Добавлен:
01.05.2014
Размер:
411.14 Кб
Скачать

3.5. Сортировка Постановка задачи

Упорядочить массив a[1..n] по неубыванию в соответствии с линейным порядком (), заданным на элементах данного массива, путем перестановки его элементов. (Отношение строгого порядка (<), как обычно, определяется следующим образом: b<c, если bc и b ≠ c.)

Сортировка с помощью d-кучи

Реализация алгоритма сортировки с помощью d-кучи (см. [1], [5]) массива a длины n осуществляется процедурой SORT_D(a, n). При этом к моменту выполнения последнего for-цикла массив a был упорядочен по невозрастанию, а после его исполнения упорядочивается по неубыванию.

В данной задаче массивом ключей d-кучи является массив a, массив имен и сами имена элементов не используются, поэтому из псевдокодов всех операций с d-кучей следует выбросить все части кода для работы с именами элементов и массивом имен.

procedure SORT_D(var a; n,d);

begin

ОБРАЗОВАTЬ_ОЧЕРЕДЬ(a,n,d);

nq:= n; while nq>1 do ИЗЪЯТИЕ_МИНИМУМА (a1, a, n, d);

for i := 1 to (n mod 2) do a[i]a[n-i+1];

end;

Временная сложность сортировки с помощью d–кучи, где d2, есть O(nlog n).

Быстрая сортировка

Быстрая сортировка (см. [1]) относится к типу алгоритмов “разделяй и властвуй”. Данный алгоритм, сортирующий массив a[1..n] по неубыванию, представлен процедурой SORT_QUICK(a, 1, n). Операция РАЗДЕЛЯЙ(a, i, j, i1) путем перестановки элементов массива a изменяет его так, чтобы a[i], …, a[i1-1] ≤ a[i1] ≤ a[i1+1], …, a[j], и одновременно определяет число i1.

procedure SORT_QUICK (var a, i, j);

begin

if i < j then begin

РАЗДЕЛЯЙ (a, i, j, i1);

SORT_QUICK (a, i, i1-1); SORT_QUICK (a, i1+1, j);

end;

end;

procedure РАЗДЕЛЯЙ (var a, i, j, var i1);

begin

k:= (i+j)mod(2); b:= a[k];

i1:= i; j1:= j;

repeat

while a[j1] < b & j1 > i do j1:= j1-1;

while a[i1] > b & i1 <j do i1:= i1+1;

if i1 <= j1 then begin

a[i1]a[j1]; i1:= i1+1; j1:= j1-1;

end;

until i1 > j1;

end;

Временная сложность быстрой сортировки n элементного массива оценивается сверху величиной O(n2), однако, в среднем быстрая сортировка выполняется за время O(nlog n).

Задания для лабораторной работы № 5

Предлагается попарное сравнение различных алгоритмов сортировки массива, состоящего из натуральных чисел.

Варианты выбора пары алгоритмов A и B для сравнения:

Вариант d=2, …, 101

  • А  сортировка d-кучей,

  • В  сортировка (d+1)-кучей;

Вариант d=102, …., 200

  • А  сортировка (d-100)-кучей,

  • В  быстрая сортировка.

Задание.

  1. Написать программу, реализующую алгоритм А и алгоритм В.

  2. Написать программу, реализующую алгоритм А и алгоритм В, для проведения экспериментов, в которых можно выбирать:

  • количество n элементов в исходном массиве a,

  • верхнюю q и нижнюю w границы для значений элементов массива,

  • заполнение массива a:

  • псевдослучайное,

  • автоматическое по неубыванию,

  • автоматическое по невозрастанию.

Выходом данной программы должно быть время работы ТА алгоритма А и время работы ТВ алгоритма В в секундах.

  1. Провести эксперименты на основе следующих данных:

    1.  q = 1, w = 109, n = 1, … ,106+1 с шагом 104, заполнение массива a:

  • псевдослучайное,

  • по возрастанию,

  • по убыванию

(нарисовать графики функций TА(n) и ТВ(n) для всех трех случаев).

    1.  q = 1, w = 1, … ,100 с шагом 1, n = 106, заполнение массива a:

  • псевдослучайное,

  • по возрастанию,

  • по убыванию.

(нарисовать графики функций TА(w) и ТВ(w) для всех трех случаев),

  1. Сформулировать и обосновать вывод о том, в каких случаях целесообразно применять алгоритм А, а в каких  алгоритм В.