Программа методом двоичного включения - Pascal ABC
Формулировка задачи:
Подскажите, пожалуйста
Использование идеи двоичного поиска позволяет значительно улучшить ал*горитм сортировки массива методом простого включения. Учитывая, что готовая последовательность, в которую надо вставить элемент, является упорядоченной,
можно методом деления пополам определять позицию включения нового элемен*та в нее. Такой модифицированный алгоритм сортировки называется методом дво*ичного включения. Написать программу, реализующую этот метод.
Решение задачи: «Программа методом двоичного включения»
textual
Листинг программы
var a:array[1..100] of integer;
n,i,j,m,l,r,x:integer;
begin
write('Введите размер массива от 2 до 100 n=');
readln(n);
randomize;
writeln('Исходный массив');
for i:=1 to n do
begin
a[i]:=random(100);
write(a[i]:4);
end;
writeln;
for i:=2 to n do
begin
x:=a[i];//запомним очередной элемент
l:=1; //девый край
r:=i; //правый край
while l<r do //пока левый меньше правого
begin
m:=(l+r) div 2; //середина
if a[m]<x then l:=m+1 else r:=m; //если средний меньше текущего
//левый ставим впереди среднего,
//иначе правый в середину
end;
for j:=i downto r+1 do a[j]:=a[j-1]; //сдвигаем отсортированную часть на 1 вправо
a[r]:=x;//текущий ставим в позицию правого
end;
writeln('Отсортированный массив');
for i:=1 to n do
write(a[i]:4);
end.
Объяснение кода листинга программы
- Создается переменная
aтипаarray[1..100] of integer. Это означает, что будет создан массив из 100 чисел типаinteger. - Задается переменная
n, которая будет использоваться для хранения размера массива. - Вызывается функция
randomize, чтобы инициализировать генератор случайных чисел. - Выводится сообщение
Введите размер массива от 2 до 100 n=. - Пользователю предлагается ввести размер массива от 2 до 100.
- Введенное значение сохраняется в переменной
n. - Генератор случайных чисел инициализируется.
- Выводится сообщение
Исходный массив. - Запускается цикл
for, который выполняетсяnраз. - Внутри цикла создаются переменные
i,j,m,l,r,x. - Переменная
iинициализируется значением 1. - Переменная
jинициализируется значениемn+1. - Переменная
mинициализируется как(i+j)деленное на 2. - Переменная
lинициализируется какmin(i, m). - Переменная
rинициализируется какmax(i, m). - Запускается вложенный цикл
while, который выполняется, покаlменьшеr. - Внутри вложенного цикла вычисляется средний элемент массива, сохраняя его в переменной
m. - Проверяется, меньше ли средний элемент текущего элемента. Если это так, то
lустанавливается равнымm+1. Если же средний элемент больше текущего, тоrустанавливается равнымm. lиrсдвигаются вправо на 1, используя сдвигa[j]=a[j-1].- В конце вложенного цикла
whileпеременнаяa[r]устанавливается равной текущему элементу. - Выводится сообщение
Отсортированный массив. - Запускается еще один цикл
for, который выполняется от 1 доn. - Внутри цикла выводится значение
a[i]с помощью функцииwrite. - Цикл
forзавершается. - Программа завершается.