СОРТИРОВКА ВСТАВКОЙ

Принцип метода:

Массив разделяется на две части: отсортированную и неотсортированную. Элементы из неотсортированной части поочередно выбираются и вставляются в отсортированную часть так, чтобы не нарушить в ней упорядоченность элементов. В начале работы алгоритма в качестве отсортированной части массива принимают только один первый элемент, а в качестве неотсортированной части –все остальные элементы.

Таким образом, алгоритм будет состоять из n-1 –го прохода (n –размерность массива), каждый из которых будет включать четыре действия:

- взятие очередного i-го неотсортированного элемента и сохранение его в дополнительной переменной;

- поиск позиции j в отсортированной части массива, в которой присутствие взятого элемента не нарушит упорядоченности элементов;

- сдвиг элементов массива от i-1-го до j-1-го вправо, чтобы освободить найденную позицию вставки;

- вставка взятого элемента в найденную j-ю позицию.

Программа, реализующая рассмотренный алгоритм, будет иметь следующий вид:

Program InsertionSort;

uses Ctr;

const

n = 20; {длина массива}

type

TVector = array [1…n] of Real;

var

Vector: TVector;

B: Real;

I, j, k: Integer;

begin

ClrScr;

Writeln ('Введите элементы массива:');

for i :=1 to n do

Read (Vector[i]);

Readln;

 

{_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ }

 

for i :=2 to n do

begin

B:= Vector[i]; {Взятие неотсортированного элемента}

{Цикл поиска позиции вставки}

j: = 1;

while (B > Vector [j]) do

j:= j + 1; {После окончания цикла индекс}

{j фиксирует позицию вставки}

{ Цикл сдвига элементов для освобождения позиции вставки }

for k := i-1 downto j do

Vector [k +1] := Vector [k] ;

{Вставка взятого элемента на найденную позицию}

Vector [j] := B;

end;

{_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _}

Writeln (' Отсортированный массив : ');

for i :=1 to n do

Write (Vector [i] :8 :2);

Writeln;

End.