Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Обработка массивов.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
502.27 Кб
Скачать

Сортировка методом вставки

Идея метода:

При вставке j-ый элемент временно размещается в дополнительную переменную, и просматриваются элементы с j-1 по 1. Они сравниваются с дополнительной переменной и сдвигаются вправо до тех пор, не встретится элемент, который окажется меньше дополнительной переменной. Как только встречается такой элемент, на освободившееся место вставляется значение дополнительной переменной (элемент под номером j+1 принимает значение дополнительной переменной).

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

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

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

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

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

…………………………….

For i:=2 to n do

begin

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

j:=i-1;

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

while (j>0) and (B<=a[i]) do

begin

a[j+1]:= a[j];

j:=j-1;

end;

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

a[j+1]:=B;

end;

……………………………

Здесь внешний цикл for по переменной i используется для организации n-1 (i=2,…,n) прохода. Переменная B используется для временного хранения взятого элемента массива. Цикл while используется для перемещения элементов массива на одну позицию вправо до тех пор, пока не найдена позиция вставки или не произошел переход к нулевому элементу.

Рассмотрим сортировку методом вставки на примере массива

5

2

4

6

1

3

При i=2 переменная B принимает значение a[2]=2. Цикл while для переменной j вызывается только один раз. После чего мы получаем массив

5

5

4

6

1

3

В результате присваивания a[j+1]:=B (a[0+1]:=2) мы получаем массив

2

5

4

6

1

3

При значениях i=3 и B=4 цикл while заканчивается при значении j=1, т.е. он вызывается только один раз и мы получаем массив

2

5

4

6

1

3

а присваивание a[j+1]:=B (a[1+1]:=4) дает нам массив

2

4

5

6

1

3

При значениях i=4 и B=6 условие цикла while B<=a[j] (6<=5), не выполняется, т.е. перемещение элементов массива не происходит, и после присваивания a[j+1]:=B (a[3+1]:=6) мы получим тот же самый массив.

2

4

5

6

1

3

При значениях i=5 и B=1 цикл while вызывается в очередной раз. Для значения j=4 цикл while дает нам массив

2

4

5

6

6

3

Для значения j=3 цикл while дает нам массив

2

4

5

5

6

3

Для значения j=2 цикл while дает нам массив

2

4

4

5

6

3

Для значения j=1 цикл while дает нам массив

2

2

4

5

6

3

При значении j=0 осуществляется выход из цикла while, а после присваивания a[j+1]:=B (a[0+1]:=1) мы получаем массив

1

2

4

5

6

3

При значениях i=6 и B=3 цикл while еще раз. Для значения j=5 цикл while дает нам массив

1

2

4

5

6

6

Для значения j=4 цикл while дает нам массив

1

2

4

5

5

6

Для значения j=3 цикл while дает нам массив

1

2

4

4

5

6

При значении j=2 осуществляется выход из цикла while, потому что условие B<=a[j] (3<=2), не выполняется.

А присваивания a[j+1]:=B (a[2+1]:=3), дает нам массив

1

2

3

4

5

6

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

1

2

3

4

5

6