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

Сортировка выбором

Задача:

Требуется отсортировать массив по возрастанию.

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

Для этого можно воспользоваться следующим алгоритмом.

  1. Найти максимальный элемент (max) в массиве (arr).

  2. Поместить его на последнее место (j).

  3. Элемент, находившийся в конце массива переместить на место, где прежде находился max.

  4. Уменьшить просматриваемую область массива на единицу (j – 1).

  5. Снова найти максимальный элемент в оставшейся области.

  6. Поместить его в конец просматриваемой области массива.

  7. и т.д.

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

const n = 10;

var

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

max, id_max, i, j: byte;

begin

randomize;

for i := 1 to n do begin

arr[i] := random(256);

write(arr[i]:4)

end;

writeln;

j := n;

while j > 1 do begin

max := arr[1];

id_max := 1;

for i := 2 to j do

if arr[i] > max then begin

max := arr[i];

id_max := i

end;

arr[id_max] := arr[j];

arr[j] := max;

j := j - 1

end;

for i := 1 to n do

write(arr[i]:4);

readln

end.

Примечания:

Присваивание длины массива переменной j не обязательно. Вместо j в цикле while можно было использовать само n. Однако в конце мы выводим на экран отсортированный массив, поэтому требуется сохранить исходное значение n.

Длина последовательности

Задача:

Определить в массиве длину самого длинного ряда повторяющихся чисел.

Например.

Если массив таков: 2, 4, 4, 4, 8, 8, 9, 12, 12, 14, 16, 16, 85,

то искомое значение равно трем, т.к. самая длинная последовательность повторяющихся чисел состоит из трех четверок.

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

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

  2. Каждый элемент должен сравниваться со следующим за ним.

  3. Если элементы равны по значению, значит, счетчик количества одинаковых элементов должен увеличиться на единицу.

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

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

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

const

M = 20;

var

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

i, n, max, curr: integer;

begin

randomize;

for i := 1 to M do begin

arr[i] := random(3) + 1;

write(arr[i]:2)

end;

max := 1;

curr := 1;

for i := 1 to n - 1 do

if arr[i] = arr[i+1] then

curr := curr + 1

else begin

if curr > max then

max := curr;

curr := 1;

end;

if curr > max then

max := curr;

writeln;

writeln (max);

readln

end.

Примечания:

Данный код не работает так, как надо. Не срабатывает ветка if. Причина не установлена.