Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

If notbUp then




Begin

Begin

Begin

Else

End

Begin

Begin

Repeat

Else

IfbUp then

Repeat

Begin

Var

Сортировка прямым слиянием

Begin

Begin

Var

Begin

Begin

Begin

Begin

Else

End

Begin

Begin

Begin

Var

Begin

Begin

Else

Begin

Inc(k);

if A[i]<A[j] then

begin A[k]:=A[i]; Inc(i); end

begin A[k]:=A[j]; Inc(j); end;

end;

 

while i<=q do

// Цикл выполняется, пока левая половина не иссякла

// (правая половина исчерпана)

Inc(k); A[k]:=A[i]; Inc(i);

end;

 

 

while j<=r do

// Цикл выполняется, пока правая половина не иссякла

// (левая половина исчерпана)

Inc(k); A[k]:=A[j]; Inc(j);

end;

 

for i:=1 to n do

// Цикл выполняется для переброски массива из временного места в постоянное

A[i]:=A[i+nCurr];

 

end;

 

Ясно, что вызов процедур

СортировкаЛевойПоловины;

СортировкаПравойПоловины;

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

 

Ниже приведен полный текст процедуры MergeSort – процедуры сортировки простым слиянием.

 

procedure MergeSort;

 

procedure Merge(p, q, r: integer);

i, j, k: integer;

i:=p;

j:=q+1;

k:=n;

 

while (i<=q) and (j<=r) do

Inc(k);

 

if A[i]<A[j] then

A[k]:=A[i];

Inc(i);

A[k]:=A[j];

Inc(j);

end;

 

Inc(nM);

end;

 

while i<=q do

Inc(k);

A[k]:=A[i];

Inc(i);

end;

 

while j<=r do

Inc(k);

A[k]:=A[j];

Inc(j);

end;

 

k:=n;

for i:=p to r do

Inc(k);

A[i]:=A[k];

end;

end;

 

procedure MergeSortAux(p, r: integer);

q: integer;

if p>=r then exit;

 

q:=(p+r) div 2;

 

MergeSortAux(p, q);

MergeSortAux(q+1, r);

Merge(p, q, r);

end;

 

MergeSortAux(1, nCurr);

end;

 

 


 

Принцип сортировки поясняется следующим примером.

 

Пусть дан массив

               

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

       
       

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

               

который состоит из подряд идущих упорядоченных пар.

 

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

       
       

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

               

который состоит из подряд идущих упорядоченных четверок.

Длина упорядоченных фрагментов растет «в геометрической прогрессии» и за короткое число фаз достигает длины всего массива.

 


Ниже приведен полный текст процедуры StraightMergeSort – процедуры сортировки прямым слиянием.

 

procedure StraightMergeSort;

i,j,k,L,t,h,m,p,q,r:

integer;

bUp:

boolean;

nMove:=0;

nCompare:=0;

 

bUp:=true;

p:=1;

 

 

h:=1;

m:=nCurr;

 

 

begin i:=1; j:=nCurr; k:=nCurr+1; L:=2*nCurr; end

begin k:=1; L:=nCurr; i:=nCurr+1; j:=2*nCurr; end;

 

if m>=p then q:=p else q:=m;

m:=m-q;

 

if m>=p then r:=p else r:=m;

m:=m-r;

 

 

while (q<>0) and (r<>0) do

nCompare:=nCompare+1;

 

if A[i]<A[j] then

A[k]:=A[i];

i:=i+1; q:=q-1;

A[k]:=A[j];

j:=j-1; r:=r-1;

end;

 

nMove:=nMove+2;

k:=k+h;

end;

 

while r>0 do

A[k]:=A[j];

nMove:=nMove+2;

k:=k+h; j:=j-1; r:=r-1;

end;

 

while q>0 do

A[k]:=A[i];

nMove:=nMove+2;

k:=k+h; i:=i+1; q:=q-1;

end;

 

h:=-h; t:=k; k:=L; L:=t;

 

until m=0;

 

bUp:= not bUp;

p:=2*p;

 

until p>=nCurr;

 

for i:=1 to nCurr do




Поделиться с друзьями:


Дата добавления: 2014-01-04; Просмотров: 245; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.021 сек.