procedure Shell(var a: Mas; n: integer); { сортировка методом Шелла } var i, j, step, t: integer;
begin step := n div 2; while step > 0 do begin for j := n - step downto 1 do begin i := j; while i <= n - step do begin if a[i] > a[i + step] then begin t := a[i]; a[i] := a[i + 1]; a[i + 1] := t end; i := i + step end end; step := step div 2 end end;
var x: Mas; i, n: integer;
begin Randomize; Write('Введите число элементов в массиве (1-100): '); Readln(n); Writeln('Исходный массив'); for i := 1 to n do begin x[i] := Random(101) - 50; Write(x[i]:4) end; Shell(x, n); Writeln(#13#10, 'Отсортированный массив'); for i := 1 to n do Write(x[i]:4) end.
Если при переводе целых чисел мы при переводе из 10-й системы при переводе в другую делим на основание системы перевода , то с дробями мы совершаем обратные действия мы УМНОЖАЕМ на основание системы счисления в которую переводим на 2 , 8 или 16, потом при произведении целая часть отбрасывается и переводится в цифру той сиситемы в которую переводим и сноваа умножаем дробную часть на основанине,до тех пор пока в дроби не получится 0 или так и будет бесконечная дробь
3. 0.0625 в 16 ричную сисстему
0.0625*16=1 целая часть 1 дробная 0 получаем что 0.0625 (10)=0.1 (16)
2. 0.0625 в 8 ричную
0.0625 * 8= 0.5 получается целая 0 дробная 5 - целую пишем как главную после запятой а 0.5 снова умножаем на 8 0.5*8=4 целая 4 дробная 0
0.0625 (10)=0.04 (8)
1. 0.025 в 2 чную
0.025*2=0.05 целая 0 дробная 05 снова дробную на 2 0.05*2= 0.1 целая 0 дробная 1 умножаем на 2 0.1*2= 0.2 целая 0 дробь 2 0.2*2=0.4 целая 0 дробь 4 0ю4*2=0.8 цлая 0 дробь 8 0.8*2=1.6 целая 1 дробь 6 0.6*2=1.2 целая 1 дробь 2 и получается что с этого места начинается периодическая дробь так как 0.2 мы уже раньше видели итак
nm = 100;
type
Mas = array[1..nm] of integer;
procedure Shell(var a: Mas; n: integer);
{ сортировка методом Шелла }
var
i, j, step, t: integer;
begin
step := n div 2;
while step > 0 do
begin
for j := n - step downto 1 do
begin
i := j;
while i <= n - step do
begin
if a[i] > a[i + step] then
begin
t := a[i];
a[i] := a[i + 1];
a[i + 1] := t
end;
i := i + step
end
end;
step := step div 2
end
end;
var
x: Mas;
i, n: integer;
begin
Randomize;
Write('Введите число элементов в массиве (1-100): ');
Readln(n);
Writeln('Исходный массив');
for i := 1 to n do
begin
x[i] := Random(101) - 50;
Write(x[i]:4)
end;
Shell(x, n);
Writeln(#13#10, 'Отсортированный массив');
for i := 1 to n do Write(x[i]:4)
end.
Тестовое решение:
Введите число элементов в массиве (1-100): 20
Исходный массив
-8 -17 -19 1 -3 23 -33 30 -27 -45 12 26 -24 18 37 8 47 -14 -19 -3
Отсортированный массив
-45 -33 -27 -24 -19 -19 -17 -14 -8 -3 -3 1 8 12 18 23 26 30 37 47
Ну это не совсем тривиальное действие
Если при переводе целых чисел мы при переводе из 10-й системы при переводе в другую делим на основание системы перевода , то с дробями мы совершаем обратные действия мы УМНОЖАЕМ на основание системы счисления в которую переводим на 2 , 8 или 16, потом при произведении целая часть отбрасывается и переводится в цифру той сиситемы в которую переводим и сноваа умножаем дробную часть на основанине,до тех пор пока в дроби не получится 0 или так и будет бесконечная дробь
3. 0.0625 в 16 ричную сисстему
0.0625*16=1 целая часть 1 дробная 0 получаем что 0.0625 (10)=0.1 (16)
2. 0.0625 в 8 ричную
0.0625 * 8= 0.5 получается целая 0 дробная 5 - целую пишем как главную после запятой а 0.5 снова умножаем на 8 0.5*8=4 целая 4 дробная 0
0.0625 (10)=0.04 (8)
1. 0.025 в 2 чную
0.025*2=0.05 целая 0 дробная 05 снова дробную на 2 0.05*2= 0.1 целая 0 дробная 1 умножаем на 2 0.1*2= 0.2 целая 0 дробь 2 0.2*2=0.4 целая 0 дробь 4 0ю4*2=0.8 цлая 0 дробь 8 0.8*2=1.6 целая 1 дробь 6 0.6*2=1.2 целая 1 дробь 2 и получается что с этого места начинается периодическая дробь так как 0.2 мы уже раньше видели итак
0.025 (10)= 0.0000011001100110 (2)= 0.0000(0110) (2)