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