Advertisement
green1ant

naturalsort

Dec 11th, 2018
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 3.60 KB | None | 0 0
  1. program merge;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. {$R *.res}
  6.  
  7. uses
  8.   System.SysUtils;
  9.  
  10. type
  11.    TIntArr = array of Integer;
  12.  
  13. procedure PrintToIndex(A: TIntArr; Index: Integer; MessageToUser: string);
  14. var
  15.    i: Integer;
  16. begin
  17.    Writeln;
  18.    Write(MessageToUser);
  19.    for i := 0 to Index do
  20.       Write(A[i], ' ');
  21.    Writeln;
  22. end;
  23.  
  24.  
  25. function FindFinalSequenceIndex(const UserArray: TIntArr): Integer;
  26. var
  27.    HighIndex, Index, i: Integer;
  28.    IsEndOfTheSequence: Boolean;
  29. begin
  30.    Index := 0;
  31.    HighIndex := High(UserArray);
  32.    IsEndOfTheSequence := False;
  33.    while (Index < HighIndex) and (not IsEndOfTheSequence) do
  34.       if UserArray[Index] <= UserArray[Index + 1] then
  35.          Inc(Index)
  36.       else
  37.          IsEndOfTheSequence := True;
  38.    //тут уже есть индекс, где заканчивается последовательность
  39.    for i := 0 to Index do
  40.       Write(UserArray[i], ' ');
  41.    Write(' |  ');
  42.    if Index = HighIndex then
  43.       FindFinalSequenceIndex := -1
  44.    else
  45.       FindFinalSequenceIndex := Index + 1;
  46. end;
  47.  
  48.  
  49.  
  50. function MergeSort(UserArray: TIntArr): TIntArr;
  51. var
  52.    LeftIndex, RightIndex, SortArrayIndex, IndexOfTheSequence: Integer;
  53.    UserArrayLen, LeftPartLen, RightPartLen: Integer;
  54.    LeftPart, RightPart: TIntArr;
  55. begin
  56.    UserArrayLen := Length(UserArray);
  57.    if UserArrayLen > 1 then
  58.    begin
  59.       IndexOfTheSequence := FindFinalSequenceIndex(UserArray);
  60.       if IndexOfTheSequence <> -1 then//если равен -1, то массив у нас уже отсортирован и ничего не надо делать
  61.       begin
  62.          LeftPart := copy(UserArray, 0, IndexOfTheSequence);
  63.          RightPart := MergeSort(copy(UserArray, IndexOfTheSequence, UserArrayLen));
  64.          LeftPartLen := Length(LeftPart);
  65.          RightPartLen := Length(RightPart);
  66.  
  67.          Writeln;
  68.          PrintToIndex(LeftPart, LeftPartLen - 1, 'Left part: ');
  69.          PrintToIndex(RightPart, RightPartLen - 1, 'Right part: ');
  70.  
  71.          LeftIndex := 0;
  72.          RightIndex := 0;
  73.          SortArrayIndex := 0;
  74.          SetLength(UserArray, LeftPartLen + RightPartLen);
  75.          while (LeftIndex < LeftPartLen) and (RightIndex < RightPartLen) do
  76.          begin
  77.             if LeftPart[LeftIndex] <= RightPart[RightIndex] then
  78.             begin
  79.                UserArray[SortArrayIndex] := LeftPart[LeftIndex];
  80.                Inc(LeftIndex);
  81.             end
  82.             else
  83.             begin
  84.                UserArray[SortaArrayIndex] := RightPart[RightIndex];
  85.                Inc(RightIndex);
  86.             end;
  87.             Inc(SortArrayIndex);
  88.          end;
  89.  
  90.          while LeftIndex < LeftPartLen do
  91.          begin
  92.             UserArray[SortArrayIndex] := LeftPart[LeftIndex];
  93.             Inc(LeftIndex);
  94.             Inc(SortArrayIndex);
  95.          end;
  96.  
  97.          while RightIndex < RightPartLen do
  98.          begin
  99.             UserArray[SortArrayIndex] := RightPart[RightIndex];
  100.             Inc(RightIndex);
  101.             Inc(SortArrayIndex);
  102.          end;
  103.          PrintToIndex(UserArray, UserArrayLen - 1, 'After merge: ');
  104.          //изменить массив UserArray, записать туда начало и смерженые правую и левую часть
  105.  
  106.          Writeln('----------');
  107.       end;
  108.    end
  109.    else
  110.       Write(UserArray[0]);
  111.    MergeSort := UserArray;
  112. end;
  113.  
  114. var
  115.    Arr: TIntArr;
  116.    i, N: Integer;
  117. begin
  118.    Writeln('Enter n');
  119.    Readln(N);
  120.  
  121.    SetLength(Arr, N);
  122.    Writeln('Enter elems');
  123.    for i := 0 to N - 1 do
  124.       Readln(Arr[i]);
  125.  
  126.    PrintToIndex(MergeSort(Arr), Length(Arr) - 1, '');
  127.    Readln;
  128. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement