program SortShell;

uses
  System.Diagnostics;

procedure ShellSort(var arr: array of Integer; n: Integer);
var
  h, i, j, k: Integer;
  s: Integer;
begin
  h := n div 2; // Начальный шаг сортировки
  while h >= 1 do // Выбор очередного шага сортировки
  begin
    for k := 0 to h - 1 do // Выбор списка для заданного шага сортировки
    begin
      for i := k + h to n - 1 do // Просмотр элементов списка
      begin
        s := arr[i];
        j := i - h;
        while (j >= 0) and (s < arr[j]) do // Перемещение элементов списка
        begin
          arr[j + h] := arr[j]; // Сдвиг элемента списка на одну позицию вправо
          j := j - h;
        end;
        arr[j + h] := s; // Вставка элемента s в нужную позицию списка
      end;
    end; // Завершение блока for k
    h := h div 2; // Изменение шага сортировки
  end;
end;

// Начальный шаг сортировки h = n div 2
{
procedure ShellSort(var arr: array of Integer; n: Integer);
var
  h, i, j, k: Integer;
  s: Integer;
begin
  h := n div 3; // Начальный шаг сортировки
  while h >= 1 do // Выбор очередного шага сортировки
  begin
    for k := 0 to h - 1 do // Выбор списка для заданного шага сортировки
    begin
      for i := k + h to n - 1 do // Просмотр элементов списка
      begin
        s := arr[i];
        j := i - h;
        while (j >= 0) and (s < arr[j]) do // Перемещение элементов списка
        begin
          arr[j + h] := arr[j]; // Сдвиг элемента списка на одну позицию вправо
          j := j - h;
        end;
        arr[j + h] := s; // Вставка элемента s в нужную позицию списка
      end;
    end; // Завершение блока for k
    h := h div 2; // Изменение шага сортировки
  end;
end;
}
{
procedure ShellSort(var arr: array of Integer; n: Integer);
var
  h, i, j, k: Integer;
  s: Integer;
begin
  h := n div 2; // Начальный шаг сортировки
  while h >= 1 do // Выбор очередного шага сортировки
  begin
    for k := 0 to h - 1 do // Выбор списка для заданного шага сортировки
    begin
      for i := k + h to n - 1 do // Просмотр элементов списка
      begin
        s := arr[i];
        j := i - h;
        while (j >= 0) and (s < arr[j]) do // Перемещение элементов списка
        begin
          arr[j + h] := arr[j]; // Сдвиг элемента списка на одну позицию вправо
          j := j - h;
        end;
        arr[j + h] := s; // Вставка элемента s в нужную позицию списка
      end;
    end; // Завершение блока for k
    h := (h - 1) div 2; // Изменение шага сортировки
  end;
end;}
procedure BubbleSort(var arr: array of Integer; n: Integer);
var
  i, j, temp: Integer;
begin
  WriteLn('Отсортированный массив методом пузырька:');
  for i := 0 to n - 2 do
  begin
    for j := 0 to n - i - 2 do
    begin
      if arr[j] > arr[j + 1] then
      begin
        temp := arr[j];
        arr[j] := arr[j + 1];
        arr[j + 1] := temp;
      end;
    end;
  end;
end;

procedure InsertSort(var arr: array of Integer; n: Integer);
var
  i, j, key: Integer;
begin
  WriteLn('Отсортированный массив методом вставок:');
  for i := 1 to n - 1 do
  begin
    key := arr[i];
    j := i - 1;
    while (j >= 0) and (arr[j] > key) do
    begin
      arr[j + 1] := arr[j];
      j := j - 1;
    end;
    arr[j + 1] := key;
  end;
end;

procedure ChoiceSort(var arr: array of Integer; n: Integer);
var
  i, j, min_idx, temp: Integer;
begin
  WriteLn('Отсортированный массив методом выбора:');
  for i := 0 to n - 2 do
  begin
    min_idx := i;
    for j := i + 1 to n - 1 do
    begin
      if arr[j] < arr[min_idx] then
        min_idx := j;
    end;
    temp := arr[min_idx];
    arr[min_idx] := arr[i];
    arr[i] := temp;
  end;
end;

procedure PrintArray(arr: array of Integer; n: Integer);
var
  i: Integer;
begin
  for i := 0 to n - 1 do
    Write(arr[i], ' ');
  WriteLn;
end;

procedure CopyArray(var source, dest: array of Integer; n: Integer);
var
  i: Integer;
begin
  SetLength(dest, n);
  for i := 0 to n - 1 do
    dest[i] := source[i];
end;

procedure InArrayConsole(var arr: array of Integer; var n: Integer);
var
  i: Integer;
begin
  Write('Задайте длину массива: ');
  ReadLn(n);
  if n >= 0 then
  begin
    SetLength(arr, n);
    Write('Задайте элементы массива: ');
    for i := 0 to n - 1 do
      ReadLn(arr[i]);

    WriteLn('Исходный массив:');
    PrintArray(arr, n);
    ShellSort(arr, n);
    WriteLn('Отсортированный массив методом Шелла:');
    PrintArray(arr, n);
  end
  else
    WriteLn('Вы ввели некорректное значение длины массива');
end;

procedure InArrayRandom(var arr: array of Integer; n: Integer);
var
  i: Integer;
begin
  Randomize;
  SetLength(arr, n);
  for i := 0 to n - 1 do
    arr[i] := Random(100);
end;

procedure Analysis;
var
  size1, b, i: Integer;
  array1_1, array1_2, array1_3, array1_4: array of Integer;
  stopWatch: System.Diagnostics.Stopwatch;
  ts: System.TimeSpan;
begin
  Write('Произведём анализ. Введите размер массива: ');
  ReadLn(size1);
  WriteLn('Выберите тип массива:');
  WriteLn('1 - Уже отсортированный по возрастанию массив');
  WriteLn('2 - Массив со случайными значениями');
  WriteLn('3 - Обратно отсортированный массив');
  ReadLn(b);
  
  if (b < 1) or (b > 3) then
  begin
    WriteLn('Введён некорректный номер');
    Exit;
  end;

  SetLength(array1_1, size1);
  
  case b of
    1: 
      begin
        for i := 0 to size1 - 1 do
          array1_1[i] := i; // Заполнение уже отсортированным массивом
      end;
    2: 
      begin
        InArrayRandom(array1_1, size1); // Ввод случайного массива
      end;
    3: 
      begin
        for i := 0 to size1 - 1 do
          array1_1[i] := size1 - i - 1; // Заполнение обратно отсортированным массивом
      end;
  end;

  // Копируем массивы для сортировки
  CopyArray(array1_1, array1_2, size1);
  CopyArray(array1_1, array1_3, size1);
  CopyArray(array1_1, array1_4, size1);

  WriteLn('Исходный массив:');
  //PrintArray(array1_1, size1);



  // Сортировка пузырьком
  stopWatch := System.Diagnostics.Stopwatch.StartNew;
  BubbleSort(array1_2, size1);
  stopWatch.Stop;
  ts := stopWatch.Elapsed;
  
  //PrintArray(array1_2, size1);
  WriteLn('Время в миллисекундах: ', ts.TotalMilliseconds:0:2);

  // Сортировка выбором
  stopWatch := System.Diagnostics.Stopwatch.StartNew;
  ChoiceSort(array1_3, size1);
  stopWatch.Stop;
  ts := stopWatch.Elapsed;

  //PrintArray(array1_3, size1);
  WriteLn('Время в миллисекундах: ', ts.TotalMilliseconds:0:2);

  // Сортировка вставками
  stopWatch := System.Diagnostics.Stopwatch.StartNew;
  InsertSort(array1_4, size1);
  stopWatch.Stop;
  
   ts := stopWatch.Elapsed;

   //PrintArray(array1_4, size1);
   WriteLn('Время в миллисекундах: ', ts.TotalMilliseconds:0:2);
     // Сортировка методом Шелла
  stopWatch := System.Diagnostics.Stopwatch.StartNew;
  ShellSort(array1_1, size1);
  stopWatch.Stop;
  ts := stopWatch.Elapsed;
  
  WriteLn('Отсортированный массив методом Шелла:');
  //PrintArray(array1_1, size1);
  WriteLn('Время в миллисекундах: ', ts.TotalMilliseconds:0:2);
end;


var
  arr: array of Integer;
  n: Integer;
begin
  InArrayConsole(arr, n);
  Analysis;
end.

Перепиши данный код на pytho