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

34. Простейшие алгоритмы сортировки (методом пузырька, сортировка выбором, шейкер сортировка, ростировка Шелла), сравнение простых методов сортировки. Пузырьковая Сортировка

Элементарный метод сортировки, который часто дают на вводных занятиях – это пузырьковая сортировка: Стоящие рядом элементы массива обмениваются местами, до тех пор, пока встречаются неотсортированные пары. Реализация этого метода дана ниже.

procedure bubble; var i,j, t : byte; begin for i := 100 downto 1 do for j:=2 to i do if x[j-1]>x[j] then begin t:=x[j-1];x[j-1]:=x[j];x[j]:=t; end; end;

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

Характеристики Простейших Сортировок

Свойство 1Сортировка выбором использует около сравнений и N обменов.

Свойство 2 Сортировка вставкой использует около сравнений иобменов в среднем, и в два раза больше в наихудшем случае.

Свойство 3Пузырьковая сортировка использует около сравнений иобменов в среднем и наихудшем случаях.

Свойство 4Сортировка вставкой линейна для «почти сортированных» файлов.

Свойство 5Сортировка выбором линейна для файлов с большими записями и маленькими ключами.

Сортировка Файлов с Большими Записями

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

Более конкретно: если массив a[1..N] содержит большие записи, то мы предпочтем использовать массив указателей p[1..N] для того, чтобы знать, где находится очередной элемент массива a, и для произведения псевдообмена. Ниже приведена программа сортировки вставкой с использованием массива указателей:

procedure insertion; var i, j, v : integer; p : array[1..N] of integer; begin for i:=1 to N do p[i] := i; for i := 2 to length(a) do begin v := p[i]; j:=i; while a[p[j-1]] > a[v] do begin p[j] := p[j-1]; j:=j-1; end; p[j] := v; end; end;

procedure rearrange; var i,j,k,t : integer; begin for i:=1 to length(a) do if p[i]<>i then begin t:=a[i]; k:=i; repeat

j := k; a[j]:=a[p[j]]; k:=p[j]; p[j]:=j; until k=i; a[j]:=t; end; end;

Для предотвращения излишнего контроля в цикле, в программе опять используются «сторожевые» элементы.

Изначально, индексы идут по порядку. Потом порядок индексов начинает меняться так, чтобы массив a, прочитанный по порядку чтения индексов был упорядочен. Но что, если данные должны быть на самом деле переупорядочены, как это показано на рисунке 6?

Для этого мы можем использовать следующую процедуру, которая физически упорядочивает записи файла используя при этом N перестановок:

рисунок 6 Переупорядочение «сортированного» массива

procedure rearrange; var i,j,k,t : integer; begin for i:=1 to length(a) do if p[i]<>i then begin t:=a[i]; k:=i; repeat j := k; a[j]:=a[p[j]]; k:=p[j]; p[j]:=j; until k=i; a[j]:=t; end; end;

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