Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник.docx
Скачиваний:
31
Добавлен:
21.12.2018
Размер:
2.15 Mб
Скачать

Слияние двух упорядоченных массивов

Задача:

Имеются два упорядоченных по возрастанию (предыдущий элемент меньше последующего) массива. Требуется получить третий упорядоченный по возрастанию массив, путем слияния первых двух.

Алгоритм решения задачи:

Например. Если

1-й массив: 4, 8, 12, 14, 23, 85,

а 2-й массив: 2, 4, 8, 9, 12, 16,

тогда 3-й массив будет таким: 2, 4, 4, 8, 8, 9, 12, 12, 14, 16, 23, 85.

Алгоритм и особенности решения задачи.

Для начала надо определиться, как у нас будут формироваться первые два массива. Использование random нам не подходит, т.к. массивы должны быть упорядоченными. Будем вводить данные с клавиатуры.

Длина третьего массива равна сумме двух первых.

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

Может возникнуть ситуация, когда один массив закончился, а второй еще нет. Поэтому в программе должен быть организован цикл записи возможного окончания как первого так и второго массива.

Программа на языке Паскаль:

const

N = 7;

var

arr1,arr2: array[1..N] of integer;

arr3: array[1..N+N] of integer;

i,j,k,m: byte;

begin

writeln('Заполните первый массив:');

for i := 1 to N do

read(arr1[i]);

writeln('Заполните второй массив:');

for i := 1 to N do

read(arr2[i]);

i := 1; j := 1; k := 1;

while (i <= N) and (j <= N) do begin

if arr1[i] < arr2[j] then begin

arr3[k] := arr1[i];

i := i + 1

end

else begin

arr3[k] := arr2[j];

j := j + 1

end;

k := k + 1;

end;

while i <= N do begin

arr3[k] := arr1[i];

i := i + 1;

k := k + 1

end;

while j <= N do begin

arr3[k] := arr1[j];

j := i + 1;

k := k + 1

end;

writeln;

for i := 1 to N+N do

write(arr3[i]:4);

end.

Удаление элементов одномерного массива

Задача:

Допустим, имеется одномерный массив, содержащий числа от 0 до 49 включительно. Требуется исключить из него все элементы, значения которых меньше 15.

Алгоритм решения задачи:

Присваивание значение n переменной m требуется, т.к. n - константа и не может быть изменена. Поскольку при "просмотре" массива в цикле while некоторые элементы будут удаляться, то значение m, обозначающее длину массива, будет уменьшаться.

Если очередной элемент не удаляется, то переходим к просмотру следующего элемента (i := i + 1) и не уменьшаем массив (m не меняется).

Программа на языке Паскаль:

const n = 20;

var

arr: array[1..n] of integer;

i, j, m: integer;

begin

randomize;

for i := 1 to n do begin

arr[i] := random(50);

write(arr[i]:4);

end;

m := n;

i := 1;

while i <= m do

if arr[i] < 15 then begin

for j := i to m - 1 do

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

m := m - 1

end

else

i := i + 1;

for i:= 1 to m do

write(arr[i]:4);

readln

end.