|
|||||||
|
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Сортировки слиянием
Лекция 15
Эта группа сортировок не подвержена вырождению. Скорость работы практически такая же, как у сортировки Хоара. Есть некоторый недостаток: для хранения сортируемых массивов требуется вдвое больше памяти, чем у сортировки Хоара. Элементы, требующие упорядочения (по возрастанию) занимают в массиве A, как и прежде, места с 1-е по nMax-е. Следующие nMax мест зарезервированы под временное хранение данных.
Сортировка простым слиянием
Идея сортировки состоит в следующем. Сортируемый массив из Фрагмент процедуры, выполняющей такую сортировку, может выглядеть так:
i:=1; // Место, с которого начинается левая половина q:= (n+1) div 2; j:=q+1; // Место, с которого начинается правая половина k:= nCurr; // Место, после которого временно помещается «слитый массив»
СортировкаЛевойПоловины; СортировкаПравойПоловины;
while (i<=q) and (j<=n) do // Цикл выполняется, пока обе половины ещё не иссякли Begin Inc(k); if A[i]<A[j] then begin A[k]:=A[i]; Inc(i); end Else begin A[k]:=A[j]; Inc(j); end; end;
while i<=q do // Цикл выполняется, пока левая половина не иссякла // (правая половина исчерпана) Begin Inc(k); A[k]:=A[i]; Inc(i); end;
while j<=r do // Цикл выполняется, пока правая половина не иссякла // (левая половина исчерпана) Begin 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); Var i, j, k: integer; Begin i:=p; j:=q+1; k:=n;
while (i<=q) and (j<=r) do Begin Inc(k);
if A[i]<A[j] then Begin A[k]:=A[i]; Inc(i); End Else Begin A[k]:=A[j]; Inc(j); end;
Inc(nM); end;
while i<=q do Begin Inc(k); A[k]:=A[i]; Inc(i); end;
while j<=r do Begin Inc(k); A[k]:=A[j]; Inc(j); end;
k:=n; for i:=p to r do Begin Inc(k); A[i]:=A[k]; end; end;
procedure MergeSortAux(p, r: integer); Var q: integer; Begin if p>=r then exit;
q:=(p+r) div 2;
MergeSortAux(p, q); MergeSortAux(q+1, r); Merge(p, q, r); end;
Begin MergeSortAux(1, nCurr); end;
Поиск по сайту: |
||||||
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (4.242 сек.) |