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

Квадратичные и субквадратичные алгоритмы

Сортировка выбором(SelectSort) Сортировка пузырьком(BubbleSort) и ее улучшения Сортировка простыми вставками(InsertSort) Cортировка Шелла (ShellSort)

Сравнение времени сортировок

Изображенный ниже график иллюстрирует разницу в эффективности изученных алгоритмов.

  • коричневая линия: сортировка пузырьком;

  • синяя линия: шейкер-сортировка;

  • розовая линия: сортировка выбором;

  • желтая линия: сортировка вставками;

  • голубая линия: сортировка вставками со сторожевым элементом;

  • фиолетовая линия: сортировка Шелла.

Логарифмические и линейные алгоритмы

Пирамидальная сортировка (HeapSort) Быстрая сортировка(QuickSort) Поразрядная сортировка(Radix sort)

Простой выбор

Это очень естественный способ сортировки, обычно он первым приходит на ум человеку, столкнувшемуся с необходимостью упорядочения таблицы. Идея его такова. Найдем в таблице элемент с наименьшим значением и поменяем его местами с первым элементом. После этого те же действия проделаем с оставшимися (без первого) N-1 элементами таблицы, затем с N-2 элементами и т. д., пока не останется один элемент - последний. Он будет наибольшим.

На Рис. 2 этот метод отображен для последовательности прямоугольников разной высоты. Два первых элемента уже упорядочены. Затем отыскивается минимальный среди остальных. Если элементы в последовательности могут быть равными, то отыскивается первый (I) среди минимальных (таким образом достигается устойчивость сортировки). Он меняется местами с третьим.

Для составления алгоритма решения этой задачи воспользуемся, как обычно, методом пошаговой детализации. Обратим внимание на то, что для получения результата нам нужно N-1 раз находить минимальное значение в таблице, длина которой уменьшается и определяется тем, в который раз мы приступили к поиску минимума. Так, в 1-й раз мы ищем минимум среди элементов A1, A2,..., AN, во 2-й - среди A2,..., AN, в i-й - среди Ai,...,AN. И еще один важный момент. Поскольку после нахождения минимального элемента его нужно будет поменять местами с другим элементом таблицы, то нужно запомнить номер минимального. Следовательно, первый шаг детализации можно представить таким оператором цикла:

I := 1 пока I<=N-1 нц найти минимальный элемент и его номер в таблице Ai,..., АN (1)   поменять местами Аi и минимальный элемент (2)   I := I+1 кц

Еще раз приведем разработанный ранее алгоритм поиска минимума.

1. K := I; X := A[I]; J := I+1 пока J<=N нц если A[J]<X   то X := A[J]; K := J   все кц

После выполнения этих действий значением переменной Х будет значение минимального среди элементов Ai,...,AN, а значением К - номер этого элемента. Следовательно, пункт 2 можно записать конкретнее:

поменять местами элементы A1 и AK (2)

Известно, что в общем случае для взаимной перестановки в памяти двух переменных нужда третья, вспомогательная:

2. C := A[I]; A[I] := A[K]; A[K] := C.

Заметим, однако, что в нашей конкретной ситуации эта третья переменная не нужна, так как ее роль играет переменная Х из пункта 1:

2. A[K] := A[I]; A[I] := X.

Мы сэкономили одно присваивание, но это немало, так как действия выполняются в цикле многократно.

Теперь можно записать полностью алгоритм сортировки простым выбором.

алг ВЫБОР(цел N, вещ таб A[1:N]) арг A, N рез A нач вещ X, цел I, J, К I := 1 пока I<=N-1 нц K := I; X := A[I]; J := I+1   пока J<=N   нц если A[J]<X       то X := a[J];K := J     все     J := J+1   кц   A[K] := A[I]; A[I] := X;   I := I+1 кц кон

На языке Паскаль оформим этот алгоритм в виде процедуры. Параметрами ее будут массив и его длина.

const m = 10;

type mass = array [l..m] of real;

procedure selec(n:integer; var a:mass);

var i,j,k : integer; x : real;

begin

for i := 1 to n-1 do

begin

k := i; x := a[i];

for j := i+l to n do

if a[j] < x

then begin x := a[j]; k := j

end;

a[k] := a[i]; a[i] := x

end

end;