Электронная таблица заполнена числами так, как это показано на рисунке. В ячейку D4 записали формулу =$A1 + B$1 + $C$1. Затем эту формулу скопировали в ячейку F5. Какое число записано в ячейке F5?
Значит так: мы создаем массив избыточной длины, куда потом будем записывать рандомные числа. Так же мы создаем массив-счетчик b (у него индексами являются сами числа, а элементами - количество этого числа в массиве А), куда будет присваиваться, сколько раз нам встречается то или иное число (перед этим мы массив обязательно обнулим). В конце мы смотрим максимальное число из массива-счетчика. Вуаля!
Вот пример программы на паскале ABC:
var a:array [1..1000000] of integer; b:array [1..10] of longint; c:integer; i,max,n:longint; begin write('Введите число элементов массива: '); readln(n); max:=0; for i:=1 to 10 do b[i]:=0; for i:=1 to n do begin a[i]:=random(10)+1; write(a[i],' '); b[a[i]]:=b[a[i]]+1 end; for i:=1 to 10 do if b[i]>max then begin c:=i; max:=b[i] end; writeln; writeln('Чаще всего в массиве встречается число ',c) end.
# - значок комментария, я использовала его, чтобы, если что, была возможность запустить код и свериться со всем в процессе
Вроде, примерно я всё описала, но если что-то не до конца понятно, можешь спрашивать!! Код действительно не самый тривиальный, но, вроде, это одна из реализаций merge sort или сортировки слиянием
Насколько я понимаю, в результате вызова этой подпрограммы мы проходимся по части массива (с элемента под номером p и до последнего) и при этом постоянно сравниваем элементы из двух частей от этой части массива - левой и правой. Таким образом, если у нас mass = {6, 3, 5, 1, 2, 7}, p = 0, q = 2, r = 5
Получаем left = {6, 3, 5}, right = {1, 2, 7}
И, проходясь по циклу while, получаем следующие значения:
Затем наш цикл заканчивается, так как просмотрены все элементы массива left, но, так как мы не поставили на место последний элемент массива right, запустится самый нижний цикл. Нам повезло и семёрка уже стоит на своём месте, но программа перепишет её ещё раз
Итог первого прохода программы: mass = {1, 2, 6, 3, 5, 7}
Как мы видим, произошла частичная сортировка, но, чтобы полностью отсортировать массив, требуется больше одного подхода и сходу весь алгоритм я написать не смогу - если это нужно, напиши и я попробую разобраться через какое-то время
# def - слово, говорящее нам о том, что перед нами подпрограмма/функция
# Атрибуты:
# mass - некоторый массив чисел
# p, q, r - некоторые значения. Имеет смысл вводить такие, что p <= q < r
def Merge(mass, p, q, r):
# Вводим массив left: это новый массив, включающий в себя с p-ого по (q+1)-ый элементы массива mass
left = mass[p : q + 1]
# Вводим массив right: это новый массив, включающий в себя с (q+1)-ого по (r+1)-ый элементы массива mass
right = mass[q + 1 : r + 1]
# i, j, k - традиционные наименования переменных циклов
i, j, k = 0, 0, p
# len() - функция для подсчёта количества элементов в массиве
# Соответственно, цикл выполняется до тех пор, пока не будут просмотрены все элементы в массиве left или все - в массиве right
while i < len(left) and j < len(right):
# Вначале мы проверяем, больше ли i-ый элемент массива left j-ого в массиве right
if left[i] < right[j]:
# Если да, заменяем k-ый элемент массива i-ым элементом массива left
mass[k] = left[i]
# И прибавляем к i единицу, чтобы сдвинуть цикл
i += 1
else:
# Если нет, заменяем k-ый элемент массива j-ым элементом массива right
mass[k] = right[j]
# И сдвигаем j на единицу
j += 1
# После этого, вне зависсимости от результата условия, сдвигаем k
k += 1
# Затем, так как есть шанс, что элементы в каком-то из массивов не просмотрены до конца, проверяем массивы
# Если программа не до конца массива left, она перекладывает все элементы из него в массив mass
while i < len(left):
mass[k] = left[i]
i += 1
k += 1
# Если программа не до конца массива right, она перекладывает все элементы из него в массив mass
Вот пример программы на паскале ABC:
var a:array [1..1000000] of integer;
b:array [1..10] of longint;
c:integer;
i,max,n:longint;
begin
write('Введите число элементов массива: ');
readln(n);
max:=0;
for i:=1 to 10 do
b[i]:=0;
for i:=1 to n do begin
a[i]:=random(10)+1;
write(a[i],' ');
b[a[i]]:=b[a[i]]+1
end;
for i:=1 to 10 do if b[i]>max then
begin
c:=i;
max:=b[i]
end;
writeln;
writeln('Чаще всего в массиве встречается число ',c)
end.
Привет питонистам!
# - значок комментария, я использовала его, чтобы, если что, была возможность запустить код и свериться со всем в процессе
Вроде, примерно я всё описала, но если что-то не до конца понятно, можешь спрашивать!! Код действительно не самый тривиальный, но, вроде, это одна из реализаций merge sort или сортировки слиянием
Насколько я понимаю, в результате вызова этой подпрограммы мы проходимся по части массива (с элемента под номером p и до последнего) и при этом постоянно сравниваем элементы из двух частей от этой части массива - левой и правой. Таким образом, если у нас mass = {6, 3, 5, 1, 2, 7}, p = 0, q = 2, r = 5
Получаем left = {6, 3, 5}, right = {1, 2, 7}
И, проходясь по циклу while, получаем следующие значения:
1-ая итерация цикла: 6 > 1 => mass = {1, 3, 5, 1, 2, 7}
2-ая: 6 > 2 => mass = {1, 2, 5, 1, 2, 7}
3-я: 6 < 7 => mass = {1, 2, 6, 1, 2, 7}
4-я: 3 < 7 => mass = {1, 2, 6, 3, 2, 7}
5-я: 5 < 7 => mass = {1, 2, 6, 3, 5, 7}
Затем наш цикл заканчивается, так как просмотрены все элементы массива left, но, так как мы не поставили на место последний элемент массива right, запустится самый нижний цикл. Нам повезло и семёрка уже стоит на своём месте, но программа перепишет её ещё раз
Итог первого прохода программы: mass = {1, 2, 6, 3, 5, 7}
Как мы видим, произошла частичная сортировка, но, чтобы полностью отсортировать массив, требуется больше одного подхода и сходу весь алгоритм я написать не смогу - если это нужно, напиши и я попробую разобраться через какое-то время
# def - слово, говорящее нам о том, что перед нами подпрограмма/функция
# Атрибуты:
# mass - некоторый массив чисел
# p, q, r - некоторые значения. Имеет смысл вводить такие, что p <= q < r
def Merge(mass, p, q, r):
# Вводим массив left: это новый массив, включающий в себя с p-ого по (q+1)-ый элементы массива mass
left = mass[p : q + 1]
# Вводим массив right: это новый массив, включающий в себя с (q+1)-ого по (r+1)-ый элементы массива mass
right = mass[q + 1 : r + 1]
# i, j, k - традиционные наименования переменных циклов
i, j, k = 0, 0, p
# len() - функция для подсчёта количества элементов в массиве
# Соответственно, цикл выполняется до тех пор, пока не будут просмотрены все элементы в массиве left или все - в массиве right
while i < len(left) and j < len(right):
# Вначале мы проверяем, больше ли i-ый элемент массива left j-ого в массиве right
if left[i] < right[j]:
# Если да, заменяем k-ый элемент массива i-ым элементом массива left
mass[k] = left[i]
# И прибавляем к i единицу, чтобы сдвинуть цикл
i += 1
else:
# Если нет, заменяем k-ый элемент массива j-ым элементом массива right
mass[k] = right[j]
# И сдвигаем j на единицу
j += 1
# После этого, вне зависсимости от результата условия, сдвигаем k
k += 1
# Затем, так как есть шанс, что элементы в каком-то из массивов не просмотрены до конца, проверяем массивы
# Если программа не до конца массива left, она перекладывает все элементы из него в массив mass
while i < len(left):
mass[k] = left[i]
i += 1
k += 1
# Если программа не до конца массива right, она перекладывает все элементы из него в массив mass
while j < len(right):
mass[k] = right[j]
j += 1
k += 1