Хочу освоить метод сортировки слиянием. Может кто-либо объяснить где и для чего его лучше применять. - 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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.167 из 5
Похожие ответы