Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Абрамов С.А., Гнездилова Г.Г., Капустина Е.Н., Селюн М.И. Задачи по программированию [pdf]

.pdf
Скачиваний:
740
Добавлен:
02.05.2014
Размер:
6.04 Mб
Скачать

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

Дана действительная матрица размера n× m; упорядочить

(переставить) строки матрицы:

а) по неубыванию значений первых элементов строк; б) по невозрастанию сумм элементов строк;

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

числовой массив a1,…,an.

631. Пусть дан упорядоченный по неубыванию массив целых или действительных чисел a1a2an и пусть дано некоторое число b (соответственно целое или действительное), для которого нужно

найти такое место среди чисел a1,…,an, чтобы после вставки числа b на это место упорядоченность не нарушилась. Если вследствие равенства между собой некоторых элементов массива число b можно вставлять на разные места, то требуется определить ближайшее к началу массива место. Эта задача называется задачей поиска места элемента. Для b имеется n+1 возможность: ba1, a1<ba2, …, an-1<ban, an<b, и решением задачи поиска места элемента b будет соответственно одно из чисел 1, …, n+1. Для решения задачи полезен алгоритм, который называется алгоритмом деления пополам: взять первоначально 1 и n+1 в качестве границ поиска места элемента; далее, до тех пор, пока границы не совпадут, шаг за шагом сдвигать эти границы следующим образом: сравнить b с as, где s – целая часть среднего арифметического границ; если as<b, то заменить прежнюю нижнюю границу на s + 1, а верхнюю оставить без изменения, иначе оставить без изменения нижнюю границу, а верхнюю заменить на s; когда границы совпадут,

став равными некоторому числу t, выполнение вышеописанного алгоритма закончится с результатом t. (Число сравнений, требуемых этим алгоритмом, не превосходит [log2(n+1)]+1.)

а) Даны действительные числа a1, …, an, b1, …, bm(a1a2≤ …≤ an). Получить натуральные числа k1, …, km такие, что ki– это решение задачи поиска места bi среди a1, …, an (i =1, …, m). Применить алгоритм деления пополам.

б) Таблица выигрышей денежной лотереи представлена массивом выигравших номеров a1,…, an и массивом выигрышей в рублях p1,…, pn (pi – это выигрыш, выпавший на номер ai (i=1,…, n)). Определить суммарный выигрыш, выпавший на билеты с номерами b1, …, bm. Применить алгоритм деления пополам.

в) Пусть место некоторого числа b среди упорядоченных по неубыванию a1, …, an выбирается как наиболее удаленное от начала последовательности место, на которое можно вставить это число, не

нарушая этим упорядоченности по неубыванию. Внести изменение в описание алгоритма деления пополам и соответственно дать новое решение задания а), сформулированного выше.

632.Даны действительные числа a1,…, an, p, натуральное число k (a1a2≤ …≤ an, kn). Удалить из a1, …, an элемент с номером k (т. е. ak) и вставить элемент, равный p, так, чтобы не нарушилась упорядоченность.

633.Алгоритм упорядочения простыми вставками (см. алгоритм в) в задаче 628) можно изменить следующим образом. Место, на которое надо вставить ai в уже упорядоченную совокупность a1, …, ai- 1, определяется алгоритмом деления пополам (см. задачу 631).

Получится новый алгоритм сортировки, который называется алгоритмом сортировки бинарными вставками (слова “бинарная вставка” следует понимать как “вставка делением пополам”). Этот

алгоритм требует всего около nlog2 n сравнений элементов. Написать программу, реализующую этот алгоритм.

634.Даны целые числа a1, …, an. Получить в порядке возрастания все различные числа, входящие в a1, …, an. Здесь удобно воспользоваться алгоритмом сортировки вставками (если n велико, то лучше применить бинарные вставки; если n сравнительно мало, скажем, n<50, то можно обойтись и простыми вставками). В процессе сортировки следует отбрасывать элементы, уже встречавшиеся раньше. Если в результате поиска места ai в упорядоченной совокупности a1, …, ak (k<i) обнаружится, что среди a1, …, ak есть элемент, равный ai, то следует перейти к рассмотрению ai+1 без изменения a1, …, ak.

635.Даны действительные числа c1, …, cp, d1, …, dq (c1c2≤ …≤

cp, d1d2≤ …≤ dq). Внести единую упорядоченность в c1,…,cp, d1,…,dq,

получив f1, f2, …, fp+ q такие, что f1f2≤ …≤ fp+ q. Число сравнений не должно превосходить p+q.

636.Алгоритм фон Неймана упорядочения массива a1 , ..., an по неубыванию (алгоритм сортировки слияниями) основан на многократных слияниях уже упорядоченных групп элементов массива (см. предыдущую задачу). Вначале весь массив рассматривается как совокупность упорядоченных групп по одному элементу в каждой. Слиянием соседних групп получаем упорядоченные группы, каждая из которых содержит два элемента (кроме, может быть, последней группы, которой не нашлось парной). Далее, упорядоченные группы укрупняются тем же способом и т. д. Здесь приходится оперировать не только с массивом a1, …, an, но и с вспомогательным массивом b1, …, bn (первоначальные значения его элементов не играют роли). Рис. 34 демонстрирует два последовательных этапа укрупнения: массивы a1, …, an, и b1, …, bn представлены в виде отрезков, которые разбиты на

части, изображающие упорядоченные группы. Число упорядоченных групп убывает, следовательно, настанет такой момент, когда в массиве a1, …, an, или b1, …, bn будет содержаться только одна упорядоченная группа. А это означает, что массив упорядочен. Для слияния двух упорядоченных групп, содержащих соответственно p и q элементов, достаточно произвести p + q сравнений. Следовательно, для одного этапа укрупнения достаточно произвести не более n сравнений. Столько же требуется на одном этапе и перемещений. Можно показать, что алгоритм фон Неймана требует в целом приблизительно n log2 n сравнений и столько же перемещений. Из рассмотренных до сих пор алгоритмов только алгоритм сортировки бинарными вставками требовал столь небольшого числа сравнений. Однако алгоритм фон Неймана выгодно отличается от последнего алгоритма тем, что требует меньше перемещений элементов a1, …, an (хотя и требует дополнительного массива b1, …, bn).

Написать программу, реализующую алгоритм фон Неймана.

Рис.34

637.Пусть дан массив a1, …, an. Требуется переставить a1, …, an так, чтобы вначале в массиве шла группа элементов, больших того элемента, который в исходном массиве располагался на первом месте, затем – сам этот элемент, потом – группа элементов, меньших или равных ему. Число сравнений и перемещений, каждое в отдельности, не должно превышать n – 1.

638.На преобразовании массива, описанном в предыдущей задаче, основывается следующий рекурсивный алгоритм сортировки (так называемая быстрая сортировка). Если массив содержит не более

одного элемента, то он упорядочен. Иначе применяем к нему преобразование, описанное в предыдущей задаче, и определяем результат применения алгоритма быстрой сортировки к a1, …, an следующим образом: вначале идет первая группа элементов, упорядоченная с помощью алгоритма быстрой сортировки, затем без изменения тот элемент, который разделял первую и вторую группы элементов, затем вторая группа элементов, упорядоченная с помощью алгоритма быстрой сортировки. Этот алгоритм не использует дополнительного массива и требует в среднем приблизительно nlog2 n сравнений и столько же перемещений элементов. Правда, это лишь среднее число: в худшем случае число сравнений может достигать n(n – 1)/2; кроме того, алгоритм быстрой сортировки содержит рекурсии.

Написать программу, реализующую алгоритм быстрой сортировки.

639.На преобразовании массива, описанном в задаче 637, основывается также следующий алгоритм поиска значения k-го по величине элемента массива a1, …, an (т. е. того элемента, который бы занял место с номером k после упорядочения массива). Пусть в результате преобразования, описанного в задаче 637, первый элемент занял p-е место; если k = p, то поиск закончен; если k < p, то надо перейти к поиску k-го по величине элемента в начальной группе элементов, содержащей p – 1 элемент (задача упростилась, так как p – 1 < n); если же k > p, то надо перейти к поиску (k p)-го по величине элемента во второй группе элементов (задача упростилась, так как n p < n). Этот алгоритм не содержит рекурсий. Не пользуясь рекурсиями, написать программу, реализующую этот алгоритм.

640.Нетрудно заметить, что алгоритм, описанный в предыдущей задаче, фактически позволяет найти не только k-й по величине элемент, но и дополнительно 1-й, 2-й, …, (k – 1)-й элементы,