Шелла реттеуі. Шелла реттеуі өзін құрған Д.Л.Шелла есіміне байланысты аталынған. Бірақ, бұл атауды сәтті деп санауға болады, реттеу кезінде орындалатын әрекеттер теңіз ракушкаларын (өлі қабықшаларын) біріне бірін жинақтауды еске салады.
Қосумен реттеу қолданатын жалпы әдіс өзара салыстырылатын элементтердің арасын азайту принципі қолданылады. Төменде "f d a c b e" массиві үшін Шелла реттеуінің орындалу схемасы көрсетілген. Алғашында үш позициядағы бірмен бірі арласқан барлық элементтер реттеледі. Содан кейін екі позициядағы араласқан барлық элементтер реттеледі. Және соңында барлық көршілес элементтер реттеледі.
1-айналым f d a c b e
2-айналым c b a f d e
3-айналым a b c e d f
Алынған нәтиже a b c d e f
Шелла реттуіне келтірілген мысал.
{ Шелла реттеуі }
procedure Shell(var item: DataArray; count:integer);
const
t = 5;
var
i, j, k, s, m: integer;
h: array[1..t] of integer;
x: DataItem;
begin
h[1]:=9; h[2]:=5; h[3]:=3; h[4]:=2; h[5]:=1;
for m := 1 to t do
begin
k:=h[m];
s:=-k;
for i := k+1 to count do
begin
x := item[i];
j := i-k;
if s=0 then
begin
s := -k;
s := s+1;
item[s] := x;
end;
while (x-
begin
item[j+k] := item[j];
j := j-k;
end;
item[j+k] := x;
end;
end;
end; { Шелла реттеуінің соңы}
алгоритмнің сырттай көрінісіне қарай отырып, оның жақсы нәтиже беретінін және нәтижесінде реттелген массив алынатындыған айтуға болмайды. Бірақ, ол екеуінде береді. Бұл алгоритмнің тиімділігі былай түсіндіріледі, әрбір айналым кезінде элементтердің біршама үлкен саны қолданылады немесе массив элементтері біршама реттелген болып табылады, ал реттелу деректерді әрбір жаңадан қарау кезінде артады.
Салыстырылатын элементтердің арақашықтығы әртүрлі болып өзгеруі мүмкін. Тек соңғы қадам ғана бірге тең болуы міндетті. Мысалы, жоғарыдағы көрсетілген мысалда қолданылған 9, 5, 3, 2, 1 тізбекті қадамдар жақсы нәтижені береді. Күрделі математикалық есептерді көрсететіндей екінің тізбектелген дәрежесінен қашық жүру тиіс, олар реттеу алгоритмінің тиімділігін төмендетеді. Бірақ, өзара салыстырылатын элементтер арасында мұндай қадамдар тізбегін қолданған кезде бұл реттеу бұрынғыша дұрыс жұмыс ітейтін болады.
Ішкі циклда екі шартты тексеру бар. "х- 0" және "j<=count" шарты "item" массивінің шегінен шығып кетпеуді болдырмау үшін қажет. Бұл қосымша тексеру Шелла реттеуін біршама нашарлатады. Шелла реттеуінің сәл өзгерген нұсқасында шынында реттелетін ақпараттың бөлігі болып табылмайтын арнайы басқарушы элементтер қолданылады. Басқарушы элементтерде деректер массиві үшін шектері бар, яғни ең үлкен және ең кіші мәндері. Бұл жағдайда шектік мәндерге тексеруді орындау міндетті емес. Бірақ, мұндай басқарушы элементтерді қолдану реттелетін ақпарат туралы арнайы мағлұматтарды талап етеді.
Шелла реттеуін талдау шамалы күрделі математикалық есептерді шешуді талап етеді. Шелла реттеуін орындау уақыты n1.2 пропорционал. Бұл тәуелділік алдынғы реттеу алгоритмінде қарастырылған квадраттық тәуелділіктен маңыздырақ. Дегенмен, Шелла реттеуін қолдану алдында сіз жылдам реттеу оданда жақсы нәтиже беретіндігін көруіңіз керек.
Достарыңызбен бөлісу: |