Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Result.docx
Скачиваний:
6
Добавлен:
22.11.2019
Размер:
1.63 Mб
Скачать

6.1. Квадратичная выборка

Квадратичная выборка по сравнению с сортировкой выбором имеет

меньшее число сравнений элементов, однако требует дополнительного

объема памяти.

Сущность метода квадратичной выборки состоит в том, что исходный

массив А из п элементов разделяется на т групп A , A ,, A по n

элементов в каждой. Если п не является точным квадратом, то массив разделяется на mгрупп, где mесть ближайший квадрат, больший п.

На первой итерации из каждой группы выбирается наименьший элемент,

которыйпересылается во вспомогательный массив В, вмещающий т элементов. В

этом массиве находится наименьший элемент, который присоединяется к

отсортированным элементам в результирующем массиве. Массив В

пополняется наименьшим элементом из той группы, которой принадлежал

элемент, отправленный в результирующий массив. На этом итерация

завершается. Затем снова находится наименьший элемент в массиве В и т.д. В

каждой группе выбранный элемент заменяется большими фиктивными

величинами.

Работа заканчивается, когда все группы будут заполнены фиктивными

величинами.

Пример 6.1.1. Квадратичной выборкой упорядочить массив

А = {8,4,6,3,7,2, 1,5}.

Исходный массив разбивается на три группы элементов:

A = {8, 4, 6}, A = {3, 7, 2}, A = {1, 5}.

Формируем вспомогательный массив, выбирая по наименьшему

элементу из каждой группы

В= {4, 2, 1}.

Находим наименьший элемент 1 из вспомогательного массива и

m

2

1

3

2

1

отправляем его в результирующий массив.

Далее изменения вспомогательного массива будут иметь следующийвид

{4, 2, 5}выбран элемент 2

{4,3, 5} выбран элемент 3

{4, 7, 5} выбран элемент 4

{6, 7, 5} выбран элемент 5

{6, 7, f} выбран элемент 6

{8, 7, f} выбран элемент 7

{8, f, f} выбран элемент 8

{f, f, f} псе элементы фиктивные, конец.

Так как на всех итерациях выбор наименьшего элемента производится

только из одной группы, содержащей n элементов, то одна итерация метода

требует n сравнений. Учитывая, что для выбора элемента во вспомогательном

массиве требуется т сравнений, получаем общее число сравнений на одной

итерации, равное n m. Всего выполняется п итераций, поэтому для

упорядочения массива квадратичной выборкой необходимо (в худшем случае) выполнить n mn сравнений. Так как m n/ n , то получаем n n n

сравненийвхудшемслучае.

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

Одним из методов сортировки массива чисел является «Быстрая

сортировка» (Quicksort). Сущность метода состоит в том, что на каж-

дой итерации выделяется часть массива чисел — рабочий массив — и для него находится главный (пороговый) элемент xA, распола-гающийся в рабочем массиве так, что каждое число в нем, распола-гающееся левее элемента x, меньше x, а каждое число, располагаю-щееся правей элемента x, больше x (см. рис. 4.1).

Рис. 4.1. Быстрая сортировка

Первоначально в качестве рабочего выбирается исходный массив, то есть устанавливаем границы рабочего массива l 1 и r n. В каче-стве главного выбирается элемент x, находящийся в середине масси-ва. Далее, начиная с i 1, последовательно увеличиваем значение i на единицу и сравниваем каждый элемент a c x, пока не будет найден

элемент a такой, что a x.

Затем, начиная с j r , последовательно уменьшаем значение. j на

единицу, пока не будет найден элемент aj такой, что x aj .

Если для найденных элементов a и aj выполняется условие i j, то

эти элементы в рабочем массиве меняются местами.

Ясно, что описанная процедура закончится нахождением главного

элемента и разделением массива на две части: одна часть будет содер-

жать элементы, меньшие x, а другая — большие x.

Далее для каждой такой части вновь применяется описанная выше

i

i

i

i

процедура.

Паскаль-программа, реализующая данный алгоритм для 10-эле-

ментного массива, имеет вид

Program Q_sort; const

N=10; var

a:array[1..N] of integer; (* исходный массив *) k:integer;

procedure QuicksortA,r:integer); (* Процедура быстрой сортировки *) var i,j,x,y: integer;

begin

i:= 1; j:= r;

x:= a[(1 + r) div 2] ; repeat

while (a[i]<x) do inc(i); while (x<a[j]) do dec(j); if (i<=j) then

begin

y:=a[i]; a[i]:=a[j]; a[j]:=y; inc(i); dec(j);

end; until (i>j);

(* Рекурсивное использование процедуры Quicksort *) if (1<j) then Quicksort (1, j );

if (i<r) then Quicksort(i,r); end;

begin

writeln('Введите',N,'элементов массива:'); for k:=l to N do readln(a[k]); Quicksort(1,N);

(* на входе левая и правая граница сортировки *) writeln('После сортировки: ');

for k:=l to N do write(a[k],1 '); end.

Лекция 7

Бинарные отношения

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