Учебное пособие Самара 2015 + 004. 43 Ббк 32. 973 Н 19


h р= з 16a -- 1,72d р lз.зё


Download 1.98 Mb.
bet50/53
Sana15.08.2023
Hajmi1.98 Mb.
#1667321
TuriУчебное пособие
1   ...   45   46   47   48   49   50   51   52   53
Bog'liq
Lekcii AiSD 2015

h р= з 16a -- 1,72d р lз.зё


следствием этого является зависимость времени работы от разме-
ра массива, которую можно выразить как N 1!6667 или N 5/3
При большем числе проходов эффективность повышается. Тем не менее, в процессе изучения алгоритма был обнаружен по- рог эффективности, который долго не удавалось преодолеть (барьер N" ). Этот барьер можно преодолеть подбором шагов.
Изменение массива при сортировке по алгоритму Шелла будет имеет вид, показанный на рисунке 13.5 (приведены исход- ное состояние массива, результат каждого прохода внешнего цикла и окончательное состояние).





а b с d е f

Рис. 13.5 Обработка массива при сортировке Шелла


В ходе изучения алгоритма исследовалась зависимость среднего числа перестановок от размера массивов при N от 100 до 60000 для нескольких типов последовательностей шагов, для которых были получены соответствующие зависимости времени работ от размера массива:






1,22
7, 3, 1 => a 1,26

1,28


11, 5, 3, 1 => 1,123
з# )/2, . . ., 40, 13, 4, 1 -» 1 ,66f 1 2
Качественное сравнение времени работы для N-квадратичных сортировок и метода Шелла приведено на рисунке 13.6.







\,27
N

0 N


Рис. 13.6 — Сравнение зависимости времени работы от размера массива для алгоритма Шелла и N-квадратичных алгоритмов





Общую формулу можно выразить как
0,3d(l« v;2 1,35d(lrr/\/),

(13.9)


или, упростив, как

или aN .


nN(liwj2 +

(13.10)


Последний шаг обязательно должен быть единичным.
Распространённой (хотя и далеко не самой эффективной)
является последовательность шагов 9, 5, 3, 2, 1.
Кроме указанных формул могут использоваться числа Фи- боначчи.
Рекомендуется избегать последовательности шагов в виде степеней двойки (..., 16, 8, 4, 2, 1), так как доказано, что это сни- жает эффективность алгоритма (хотя сортировка выполняется и в этом случае).
Один из рекомендуемых вариантов выбора последователь- ности шагов: принять шаги последнего и каждого предыдущего этапов hi 1, h,+ —— 36, + I, и остановиться на некотором шаге he .
когда he + 2 В итоге получается последовательность шагов , 121, 40, 13, 4, 1 (такая же, как в случае (3k 1)/2), которая является
одной из самых эффективных. Возможны и другие, эвристически подбираемые последовательности шагов, ещё более эффективные

182


(HllПJЭHMep, 120, 40, 12, 4, 1). PaзyMeeTCR, боЈlьшие шІlГН MoryT
П]ЗИМёНЯТЬСЯ ТОЛЬКО ДЛЯ МІІССИВОВ большогО ]3lI3Më]3lI.
ВоЗмоWёН ТІІКже расч Т Шllra перВогО ЭTIlHa, исходя из разМера
MIlCCHBa, и yMeHЬIIIëHHë шаГІ1 ВДВОё НІ1 КІ1Ж@ОМ СлепующеМ ЭTIlHe.
Пpoueдypa сО]ЭТН]ЗОВКН МёТОДОМ ШёППіІ H£t ЯЗЬІКё £tCKdЛb.

procedure shell(item: array of char; n: integ—


er);
var
i, j, k, h: Integer;
x: char;
a: array[0..4] of integer;
begin
a[0] := 9; a[1] := 5;
a[2] := 3; a[3] := 2;
a[4] := 1;
for k := 0 to 4 do
begin
h := a[k];
for i := h to n-1 do begin
x := item[i];
j i-h;
while (x < item[j]) and ( j>= 1) do begin
item[j + h] := item[j]; j j-h
end:
item[j + h] := x
end end
end;

AHi1JI€1FHUHas QyHKuHII His FH++.


const int ST = 5;


void Shell_sort(char* item, int n)

int step[ST] = {120, 40, 12, 4, 1}; // Mac-





183
int i, ј, k, h; char buf;


for ( k = 0; k < ST; ++k)

h = step[k];


for (i = h; i < п; ++i)



ј h)
buf = item[i];
for (ј = i - h; buf < item[j] && ј >= 0;

item[j + h] = item[ j]; item[j + h] = buf;



Проверка условия ј 1 (для Паскаля) или ј 0 (для Си++) предотвращает выход за пределы массива. Считается, что такие дополнительные проверки слегка снижают производитель- ность алгоритма.




Download 1.98 Mb.

Do'stlaringiz bilan baham:
1   ...   45   46   47   48   49   50   51   52   53




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling