Вопрос 7
Обычно когда необходимо рассмотреть способы сокращения перебора, авторы всегда разбирают задачу расстановки 8 ферзей на шахматной доске. Поскольку эту задачу больше 200 лет тому назад решил еще Леонард Эйлер, то вряд ли сейчас есть, хоть какая-то возможность ошибиться, при описании решения этой проблемы. Но в связи с тем, что техника не стоит на месте и прямой перебор 40320 (=8!) вариантов, а именно столько вариантов расстановки ферзей надо рассмотреть, чтобы решить задачу, не является чем то из ряда вон выходящим и осуществляется, даже не на самом современном компьютере, меньше чем за минуту, то и сокращение такого перебора прямо скажем не слишком впечатляет
Задача коммивояжёра (англ. Travelling salesman problem, сокращённо TSP) — одна из самых известных задач комбинаторной оптимизации, заключающаяся в отыскании самого выгодного маршрута, проходящего через указанные города хотя бы по одному разу с последующим возвратом в исходный город. В условиях задачи указываются критерий выгодности маршрута (кратчайший, самый дешёвый, совокупный критерий и тому подобное) и соответствующие матрицы расстояний, стоимости и тому подобного. Как правило, указывается, что маршрут должен проходить через каждый город только один раз — в таком случае выбор осуществляется среди гамильтоновых циклов.
Вопрос 8
Алгоритм сортировки — это алгоритм для упорядочивания элементов в списке. В случае, когда элемент списка имеет несколько полей, поле, служащее критерием порядка, называется ключом сортировки. На практике в качестве ключа часто выступает число, а в остальных полях хранятся какие-либо данные, никак не влияющие на работу алгоритма.
Сортировка подсчётом — алгоритм сортировки, в котором используется диапазон чисел сортируемого массива (списка) для подсчёта совпадающих элементов. Применение сортировки подсчётом целесообразно лишь тогда, когда сортируемые числа имеют (или их можно отобразить в) диапазон возможных значений, который достаточно мал по сравнению с сортируемым множеством, например, миллион натуральных чисел меньших 1000. Эффективность алгоритма падает, если при попадании нескольких различных элементов в одну ячейку, их надо дополнительно сортировать. Необходимость сортировки внутри ячеек лишает алгоритм смысла, так как каждый элемент придётся просматривать более одного раза.
Сортировка вставками — примитивный алгоритм сортировки с высокой вычислительной сложностью: .
Сортировка слиянием (англ. merge sort) — алгоритм сортировки, который упорядочивает списки (или другие структуры данных, доступ к элементам которых можно получать только последовательно, например — потоки) в определённом порядке.
Сортировка подсчетом код
SimpleCountingSort
for i = 0 to k - 1
C[i] = 0;
for i = 0 to n - 1
C[A[i]] = C[A[i]] + 1;
b = 0;
for j = 0 to k - 1
for i = 0 to C[j] - 1
A[b] = j;
b = b + 1;
Вопрос 9
Сортировка
простыми обменами, сортиро́вка
пузырько́м (англ. bubble
sort) —
простой алгоритм
сортировки.
Для понимания и реализации этот алгоритм —
простейший, но эффективен он лишь для
небольших массивов. Алгоритм состоит
из повторяющихся проходов по сортируемому
массиву. За каждый проход элементы
последовательно сравниваются попарно
и, если порядок в паре неверный, выполняется
обмен элементов. Проходы по массиву
повторяются
раз
или до тех пор, пока на очередном проходе
не окажется, что обмены больше не нужны,
что означает — массив отсортирован.
При каждом проходе алгоритма по
внутреннему циклу, очередной наибольший
элемент массива ставится на своё место
в конце массива рядом с предыдущим
«наибольшим элементом», а наименьший
элемент перемещается на одну позицию
к началу массива («всплывает» до нужной
позиции как пузырёк в воде, отсюда и
название алгоритма).
Сортировка перемешиванием (англ. Cocktail sort) — разновидность пузырьковой сортировки. Анализируя метод пузырьковой сортировки, можно отметить два обстоятельства. Во-первых, если при движении по части массива перестановки не происходят, то эта часть массива уже отсортирована и, следовательно, ее можно исключить из рассмотрения. Во-вторых, при движении от конца массива к началу минимальный элемент “всплывает” на первую позицию, а максимальный элемент сдвигается только на одну позицию вправо.
Эти две идеи приводят к следующим модификациям в методе пузырьковой сортировки. Границы рабочей части массива (т.е. части массива, где происходит движение)устанавливаются в месте последнего обмена на каждой итерации. Массив просматривается поочередно справа налево и слева направо.
Лучший
случай для этой сортировки — отсортированный
массив (
),
худший — отсортированный в обратном
порядке (
).
Наименьшее
число сравнений в алгоритме
Шейкер-сортировки
.
Это соответствует единственному проходу
по упорядоченному массиву (лучший
случай)
Сортировка расчёской (англ. comb sort) — это довольно упрощённый алгоритм сортировки, изначально спроектированный Влодзимежом Добосиевичем в 1980 г. Позднее он был переоткрыт и популяризован в статье Стивена Лэйси и Ричарда Бокса в журнале Byte Magazine в апреле 1991 г[1]. Сортировка расчёской улучшает сортировку пузырьком, и конкурирует с алгоритмами, подобными быстрой сортировке. Основная идея — устранить черепах, или маленькие значения в конце списка, которые крайне замедляют сортировку пузырьком (кролики, большие значения в начале списка, не представляют проблемы для сортировки пузырьком).
В сортировке пузырьком, когда сравниваются два элемента, промежуток (расстояние друг от друга) равен 1. Основная идея сортировки расчёской в том, что этот промежуток может быть гораздо больше, чем единица (сортировка Шелла также основана на этой идее, но она является модификацией сортировки вставками, а не сортировки пузырьком).
В «пузырьке», «шейкере» и «чёт-нечете» при переборе массива сравниваются соседние элементы. Основная идея «расчёски» в том, чтобы первоначально брать достаточно большое расстояние между сравниваемыми элементами и по мере упорядочивания массива сужать это расстояние вплоть до минимального. Таким образом, мы как бы причёсываем массив, постепенно разглаживая на всё более аккуратные пряди. Первоначальный разрыв между сравниваемыми элементами лучше брать с учётом специальной величины, называемой фактором уменьшения, оптимальное значение которой равно примерно 1,247. Сначала расстояние между элементами равно размеру массива, разделённого на фактор уменьшения (результат округляется до ближайшего целого). Затем, пройдя массив с этим шагом, необходимо поделить шаг на фактор уменьшения и пройти по списку вновь. Так продолжается до тех пор, пока разность индексов не достигнет единицы. В этом случае массив досортировывается обычным пузырьком.
Пример сортировки пузырьком на ПАСХАЛЕ
const
m = 10;
var
arr: array[1..m] of integer;
i, j, k: integer;
begin
randomize;
write ('Исходный массив: ');
for i := 1 to m do begin
arr[i] := random(256);
write (arr[i]:4);
end;
writeln; writeln;
for i := 1 to m-1 do
for j := 1 to m-i do
if arr[j] > arr[j+1] then begin
k := arr[j];
arr[j] := arr[j+1];
arr[j+1] := k
end;
write ('Отсортированный массив: ');
for i := 1 to m do
write (arr[i]:4);
writeln;
readln
end.
