Хочу освоить метод сортировки слиянием. Может кто-либо объяснить где и для чего его лучше применять. - C#
Формулировка задачи:
Всем здравствуйте! Вновь мне нужна помощь по С#. Я хочу освоить метод сортировки слиянием. Может кто-либо объяснить где и для чего его лучше применять. Еще мне нужен код программы, где используется этот метод, для примера. Спасибо заранее, господа.
Решение задачи: «Хочу освоить метод сортировки слиянием. Может кто-либо объяснить где и для чего его лучше применять.»
textual
Листинг программы
- Procedure MergeSort(var PFirst: TPtr);
- var
- PLeft, PRight, PStopLeft, PStopRight, ptr, PBlockStart, PLast, PStart : TPtr;
- i,n:Integer;
- itermax,itercount:byte;
- begin
- itermax:=Trunc(Ln(StrToFloat(form1.EditNumber.Text))/ln(2)+0.999999);
- n:=1;
- itercount:=0;
- PStart:=PFirst;
- Repeat
- inc(itercount);
- n:=n*2;
- repeat //Блок одного прохода сортировки
- // Блок №1: установка указателей на нужные позиции в течение одной итерации
- PBlockStart:=nil;
- PLast:=nil;
- PLeft:=PFirst;
- PRight:=PFirst;
- PStopRight:=PFirst;
- for i := 1 to (n div 2) do
- begin
- PRight:=PRight^.Next;
- if PRight = nil then break;
- If (PStopRight <> nil) and (PStopRight^.Next <> nil)
- then PStopRight:=PStopRight^.Next^.Next
- else PStopRight := nil;
- end;
- PStopLeft:=PRight;
- //Блок №2: работа с указателями. Запись во вспомогательный список
- while (PLeft <> PStopLeft) or (PRight <> PStopRight) do
- begin
- new(ptr);
- if (PLeft <> PStopLeft) and
- ((PRight = PStopRight) or (PLeft^.Value<PRight^.Value)) then begin
- ptr^.Value := PLeft^.Value;
- PLeft:=PLeft^.Next
- end
- else begin
- ptr^.Value := PRight^.Value;
- PRight:=PRight^.Next
- end;
- ptr^.Next:=nil;
- ptr^.Prev:=PLast;
- if PBlockStart=nil then PBlockStart:=ptr
- else PLast^.Next:=ptr;
- PLast:=Ptr;
- end;
- //Блок №3: запись значений вспомогательного списка в основной
- while PBlockStart<>nil do begin
- PFirst^.Value:=PBlockStart^.Value;
- if PFirst^.next = nil then break;
- PFirst:=PFirst^.Next;
- PLast:=PBlockStart;
- PBlockStart:=PBlockStart^.Next;
- Dispose(PLast); // В данном случае PLast используется не по назначению
- end; // для освобождения занятой временным списком памяти.
- until PStopRight = nil; //Конец прогона
- PFirst:=PStart; //Перенос указателя PFirst на начало
- Until itercount = itermax; //Конец всех прогонов
- end; //END OF PROCEDURE
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д