
- •Обработка одномерных массивов на языке программирования turbo pascal Учебное пособие для студентов
- •Оглавление
- •Введение
- •Теоретический материал по массивам Понятие массива
- •Индексы массива
- •Представление массива в памяти
- •Пользовательский тип – массив
- •Одномерные и n-мерные массивы
- •Двумерные массивы
- •Основные алгоритмы обработки массивов Общие замечания
- •Ввод/вывод массива
- •Вычисление суммы и среднего арифметического элементов массива
- •Поиск максимального/минимального элемента массива
- •Подсчет количества элементов, удовлетворяющих заданному условию
- •Удаление элемента из массива
- •Вставка новых элементов в массив
- •Удаление нескольких элементов массива
- •Обработка нескольких массивов
- •Проверка соседних элементов массива
- •Методы сортировок массивов Сортировка массивов
- •Сортировка методом вставки
- •Сортировка методом выбора
- •"Пузырьковая" сортировка
- •Быстрая сортировка
- •Примеры решения задач на сортировку массивов
- •Задания для самостоятельного решения Вариант №1
- •Вариант №2
- •Вариант №3
- •Вариант №4
- •Вариант №5
- •Вариант №6
- •Вариант №7
- •Вариант №8
- •Вариант №9
- •Вариант №10
- •Вариант №11
- •Вариант №12
- •Вариант №13
- •Вариант №14
- •Вариант №15
- •Список используемой литературы
- •420012, Казань, ул. Чехова, 36
Сортировка методом вставки
Идея метода:
При вставке j-ый элемент временно размещается в дополнительную переменную, и просматриваются элементы с j-1 по 1. Они сравниваются с дополнительной переменной и сдвигаются вправо до тех пор, не встретится элемент, который окажется меньше дополнительной переменной. Как только встречается такой элемент, на освободившееся место вставляется значение дополнительной переменной (элемент под номером j+1 принимает значение дополнительной переменной).
Алгоритм состоит из n-1 прохода (n – размерность массива), каждый из которых включает три действия:
взятие очередного j-го неотсортированного элемента и сохранение его в дополнительной переменной;
сдвиг элементов массива, начиная c j-го, вправо до тех пор, пока не найдена позиция, где присутствие взятого элемента не нарушит упорядоченности элементов;
вставка взятого элемента в найденную позицию.
Программа, реализующая рассмотренный алгоритм будет иметь следующий вид:
…………………………….
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 |