Хочу освоить метод сортировки слиянием. Может кто-либо объяснить где и для чего его лучше применять. - C#

Узнай цену своей работы

Формулировка задачи:

Всем здравствуйте! Вновь мне нужна помощь по С#. Я хочу освоить метод сортировки слиянием. Может кто-либо объяснить где и для чего его лучше применять. Еще мне нужен код программы, где используется этот метод, для примера. Спасибо заранее, господа.

Решение задачи: «Хочу освоить метод сортировки слиянием. Может кто-либо объяснить где и для чего его лучше применять.»

textual
Листинг программы
  1. Procedure MergeSort(var PFirst: TPtr);
  2. var
  3.   PLeft, PRight, PStopLeft, PStopRight, ptr, PBlockStart, PLast, PStart : TPtr;
  4.   i,n:Integer;
  5.   itermax,itercount:byte;
  6. begin
  7. itermax:=Trunc(Ln(StrToFloat(form1.EditNumber.Text))/ln(2)+0.999999);
  8. n:=1;
  9. itercount:=0;
  10. PStart:=PFirst;
  11. Repeat
  12. inc(itercount);
  13. n:=n*2;
  14. repeat //Блок одного прохода сортировки
  15.   // Блок №1: установка указателей на нужные позиции в течение одной итерации
  16.   PBlockStart:=nil;
  17.   PLast:=nil;
  18.   PLeft:=PFirst;
  19.   PRight:=PFirst;
  20.   PStopRight:=PFirst;
  21.   for i := 1 to (n div 2) do
  22.     begin
  23.       PRight:=PRight^.Next;
  24.       if PRight = nil then break;
  25.       If (PStopRight <> nil) and (PStopRight^.Next <> nil)
  26.         then PStopRight:=PStopRight^.Next^.Next
  27.         else PStopRight := nil;
  28.     end;
  29.   PStopLeft:=PRight;
  30.   //Блок №2: работа с указателями. Запись во вспомогательный список
  31.   while (PLeft <> PStopLeft) or (PRight <> PStopRight) do
  32.     begin
  33.     new(ptr);
  34.     if (PLeft <> PStopLeft) and
  35.        ((PRight = PStopRight) or (PLeft^.Value<PRight^.Value)) then begin
  36.        ptr^.Value := PLeft^.Value;
  37.        PLeft:=PLeft^.Next
  38.        end
  39.     else begin
  40.        ptr^.Value := PRight^.Value;
  41.        PRight:=PRight^.Next
  42.     end;
  43.     ptr^.Next:=nil;
  44.     ptr^.Prev:=PLast;
  45.     if PBlockStart=nil then PBlockStart:=ptr
  46.                        else PLast^.Next:=ptr;
  47.     PLast:=Ptr;
  48.   end;
  49.   //Блок №3: запись значений вспомогательного списка в основной
  50.   while PBlockStart<>nil do begin
  51.     PFirst^.Value:=PBlockStart^.Value;
  52.     if PFirst^.next = nil then break;
  53.     PFirst:=PFirst^.Next;
  54.     PLast:=PBlockStart;
  55.     PBlockStart:=PBlockStart^.Next;
  56.     Dispose(PLast); // В данном случае PLast используется не по назначению
  57.   end;              // для освобождения занятой временным списком памяти.
  58. until PStopRight = nil; //Конец прогона
  59. PFirst:=PStart; //Перенос указателя PFirst на начало
  60. Until itercount = itermax; //Конец всех прогонов
  61.  
  62. end;  //END OF PROCEDURE

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


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

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

6   голосов , оценка 4.167 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы