ВУЗ:
Составители:
Рубрика:
45
освободим место A[k+1] для элемента A[ i ], куда его и поставим. После
того, как мы проделаем подобные действия для всех элементов со второго
по n-ный, получим отсортированную последовательность. Следует
отметить, что при сравнении A[ i ] элемента со всеми элементами,
стоящими леве его может оказаться, что не найдется такого эле
мента A[k ],
для которого выполняется условие A[ k ] ≤ A[ i ]. Это будет, если A[ i ]
меньше всех элементов, стоящих левее. Данная ситуация изображена на
Рисунке 22 дорожным знаком “прочие опасности”
!
. В этом случае
необходимо закончить просмотр по достижению первого элемента
последовательности и осуществить сдвиг А[1], …, А[i-1] вправо на одну
позицию, а элемент A[ i ] поставить на первое место. Кроме того, может
оказаться, что элемент A[ i ] стоит на своем месте, поэтому полученное
значение k+1 необходимо сравнивать со значением i. Если он
и совпадают,
то сдвига не требуется.
Таблица 10. Числовой пример алгоритма
Номер элемента
1 2 3 4 5 6 7 8 9
Исходный массив
82
31
22 16 7 12 63 29 54
2 31
82
22
16 7 12 63 29 54
3 22
31 82
16
7 12 63 29 54
4 16
22 31 82
7
12 63 29 54
5 7
16 22 31 82
12
63 29 54
6
7
12
16 22 31 82
63
29 54
7
7 12 16 22 31
63
82
29
54
8
7 12 16 22
29
31 63 82
54
После вставки элемента
номер
9
7 12 16 22 29 31
54
63 82
Упорядоченный массив
7 12 16 22 29 31 54 63 82
С учетом замечаний составим блок-схему изложенного метода.
Основой алгоритма будет цикл, параметр которого i определяет, для
какого элемента массива мы ищем место в упорядоченной левой части.
Значение параметра i будет меняться в пределах от 2 до n. Кроме того,
значение элемента A[ i ] необходимо запоминать, например, в переменной
x, так как он
о при сдвиге может потеряться. Необходимо также
зафиксировать номер элемента i-1, с которого будем начинать сравнение
j=i–1. Чтобы в ситуации, когда элемент A[ i ] окажется минимальным
среди элементов А[1], …, А[i-1], он мог занять первое место, положим
начальное значение k=1 (k – номер элемента, на место которого
помещается A[ i ] элемент). Так как мы не знаем значение k, то следует
испо
льзовать итерационный цикл по параметру j. В этом цикле будем
сравнивать элементы A[ j ] и A[ i ] и по результату сравнения судить,
оканчивать цикл или нет. Закончить цикл можно присваиванием
46
параметру j нулевого значения. Итак, если выполняется условие A[j]≤A[ i],
то следует п
родолжать движение влево по массиву, то есть полагать j=j–1.
При этом нужно следить, чтобы массив не кончился. Если левая часть
массива просмотрена или найден номер k, то необходимо проверить,
совпадают ли значения k и i, если совпадают, то вставляемый элемент
стоит на своем месте, поэтому переходим к следующему i. В пр
отивном
случае, необходимо в цикле сдвинуть все элементы от k-го до i–1-го
вправо на одну позицию и на место k-го элемента поместить вставляемый
элемент, значение которого хранится в x. Сдвиг необходимо начинать с
последнего элемента, чтобы не “затереть” значения последующих
элементов. Значение параметра цикла сдвига может из
меняться либо от
i–1-го до k, либо от i до k+1, это повлияет лишь на задание индексов
элементов массива. Блок-схема алгоритма метода сортировки вставками
представлена на Рисунке 25.
Программа 16. Процедура сортировки
методом вставок
Const n=20;
Type mass=array[1 . . n] of real;
procedure Insert(var A:mass; n: integer);
Label 1;
var i, j, k: integer; x: real;
begin for i:=1 to n do
begin x:=A[ i ]; j:=i–1; k:=1;
while j> 0 do
if A[ i ] ≥ A[ j ] then
begin k:=j+1; j:=0 end
else j:=j–1;
if k=i then goto 1;
for j:=1 downto k+1 do
A[ j ]:= A[ j–1 ];
A[ k ]:=x;
1: end;
end;
Рисунок 26. Блок-схема улучшенного
алгоритма сортировки методом вставок
НАЧАЛО
КОНЕЦ
i:=2, n
A( i ) ≥ A(k)
нет
да
k:=1, i–1
X:= A( i );
j:=1,k+1(–1)
A( j):= A(j–1);
A( k ):= X;
освободим место A[k+1] для элемента A[ i ], куда его и поставим. После параметру j нулевого значения. Итак, если выполняется условие A[j]≤A[ i], того, как мы проделаем подобные действия для всех элементов со второго то следует продолжать движение влево по массиву, то есть полагать j=j1. по n-ный, получим отсортированную последовательность. Следует При этом нужно следить, чтобы массив не кончился. Если левая часть отметить, что при сравнении A[ i ] элемента со всеми элементами, массива просмотрена или найден номер k, то необходимо проверить, стоящими леве его может оказаться, что не найдется такого элемента A[k ], совпадают ли значения k и i, если совпадают, то вставляемый элемент для которого выполняется условие A[ k ] ≤ A[ i ]. Это будет, если A[ i ] стоит на своем месте, поэтому переходим к следующему i. В противном меньше всех элементов, стоящих левее. Данная ситуация изображена на случае, необходимо в цикле сдвинуть все элементы от k-го до i1-го Рисунке 22 дорожным знаком прочие опасности ! . В этом случае вправо на одну позицию и на место k-го элемента поместить вставляемый необходимо закончить просмотр по достижению первого элемента элемент, значение которого хранится в x. Сдвиг необходимо начинать с последовательности и осуществить сдвиг А[1], , А[i-1] вправо на одну последнего элемента, чтобы не затереть значения последующих позицию, а элемент A[ i ] поставить на первое место. Кроме того, может элементов. Значение параметра цикла сдвига может изменяться либо от оказаться, что элемент A[ i ] стоит на своем месте, поэтому полученное i1-го до k, либо от i до k+1, это повлияет лишь на задание индексов значение k+1 необходимо сравнивать со значением i. Если они совпадают, элементов массива. Блок-схема алгоритма метода сортировки вставками то сдвига не требуется. представлена на Рисунке 25. Таблица 10. Числовой пример алгоритма НАЧАЛО Программа 16. Процедура сортировки методом вставок Номер элемента 1 2 3 4 5 6 7 8 9 Const n=20; Исходный массив 82 31 22 16 7 12 63 29 54 i:=2, n 82 16 7 12 63 29 54 Type mass=array[1 . . n] of real; 2 31 22 3 22 31 82 16 7 12 63 29 54 k:=1, i1 procedure Insert(var A:mass; n: integer); 4 16 22 31 82 7 12 63 29 54 Label 1; После вставки элемента 5 7 16 22 31 82 12 63 29 54 да номер 6 7 12 16 22 31 82 63 29 54 var i, j, k: integer; x: real; A( i ) ≥ A(k) 7 7 12 16 22 31 63 82 29 54 begin for i:=1 to n do нет 8 7 12 16 22 29 31 63 82 54 begin x:=A[ i ]; j:=i1; k:=1; 9 7 12 16 22 29 31 54 63 82 X:= A( i ); Упорядоченный массив 7 12 16 22 29 31 54 63 82 while j> 0 do С учетом замечаний составим блок-схему изложенного метода. if A[ i ] ≥ A[ j ] then j:=1,k+1(1) Основой алгоритма будет цикл, параметр которого i определяет, для begin k:=j+1; j:=0 end какого элемента массива мы ищем место в упорядоченной левой части. else j:=j1; Значение параметра i будет меняться в пределах от 2 до n. Кроме того, A( j):= A(j1); значение элемента A[ i ] необходимо запоминать, например, в переменной if k=i then goto 1; x, так как оно при сдвиге может потеряться. Необходимо также for j:=1 downto k+1 do зафиксировать номер элемента i-1, с которого будем начинать сравнение A( k ):= X; j=i1. Чтобы в ситуации, когда элемент A[ i ] окажется минимальным A[ j ]:= A[ j1 ]; среди элементов А[1], , А[i-1], он мог занять первое место, положим A[ k ]:=x; начальное значение k=1 (k номер элемента, на место которого 1: end; помещается A[ i ] элемент). Так как мы не знаем значение k, то следует КОНЕЦ использовать итерационный цикл по параметру j. В этом цикле будем end; сравнивать элементы A[ j ] и A[ i ] и по результату сравнения судить, Рисунок 26. Блок-схема улучшенного оканчивать цикл или нет. Закончить цикл можно присваиванием алгоритма сортировки методом вставок 45 46
Страницы
- « первая
- ‹ предыдущая
- …
- 21
- 22
- 23
- 24
- 25
- …
- следующая ›
- последняя »