3. Алгоритмы сортировкиИз решения предыдущей задачи вытекает, что чрезвычайно важно иметь хорошие алгоритмы упорядочения элементов последовательности. В программировании для задач упорядочения обычно используют термин сортировка. Описанный выше алгоритм сортировки (см. задачу 3) не является оптимальным. Известны алгоритмы сортировки со сложностью в худшем случае порядка и n*log n. К ним относится обменная сортировка с разделением, которая заключается в следующем: 1. в исходном неотсортированном массиве выбрать некоторый элемент x = a[i]; 2. переставить элементы массива таким образом, чтобы слева от х оказались элементы массива, меньшие или равные х, а справа — элементы массива, большие х. Пусть при этом элемент х попадает в позицию с номером k, тогда массив будет иметь вид ( a[1], а[2],...,a[k-1], a[k], a[k+1],…,a[n] ). Каждый из элементов а[1], а[2],..., a[k-1] меньше либо равен a[k], каждый из элементов а[k+1],..., а[n] больше a[k]. Отсюда можно сделать вывод, что элемент a[k] стоит на своем месте. А исходный массив при этом разделился на две неотсортированные части, барьером между которыми является элемент a[k], 3) далее необходимо применить шаги 1 и 2 для каждой из двух неотсортированных частей. И так до тех пор, пока не останутся подмассивы, состоящие из одного элемента, т. е. пока не будет отсортирован весь массив. Выбор алгоритма сортировки зависит от структуры обрабатываемых данных. Поэтому соответствующие методы были разбиты на два класса: сортировка массивов (таблиц) и сортировка файлов (последовательностей). Иногда эти методы называют внутренней и внешней сортировкой, поскольку массивы • хранятся во внутренней, оперативной, памяти машины, а файлы — в более медленной внешней памяти. Если данные «выстроены» в виде массива, то доступ имеется ко всем его элементам. Если же данные образуют файл, то доступ имеется только к одной величине из множества элементов, записанных в файл. Основное условие для сортировки массивов заключается в следующем: выбранный метод сортировки должен обеспечивать экономное расходование доступной памяти. Это означает, что перестановки, приводящие элементы в порядок, должны выполняться «на том же месте», т. е. методы, в которых элементы из массива А передаются в результирующий массив В, представляют существенно меньший интерес. Сортировать элементы можно по неубыванию (a1<=a2<=...<=an) и по невозрастанию (at>=a2>=an). Методы сортировки «на том же месте» можно разбить на три основные категории. 1.Сортировки с помощью выбораАлгоритм метода заключается в следующем: находят элемент массива, имеющий наименьшее значение, меняют местами его и первый элемент, затем выполняют то же самое, начав со второго элемента, и т. д. 2.Сортировки с помощью включенияАлгоритм метода состоит в следующем: последовательно просматривают элементы a1,a2,...,an и каждый новый элемент ai вставляют на подходящее место в уже упорядоченную совокупность ai-1. Это место определяется последовательным сравнением ai с упорядоченными элементами a1 …, ai-1. 3.Сортировки с помощью обменовАлгоритм метода таков: последовательным просмотром элементов a1,a2,...,an находят наименьшее i такое, что ai>ai+1. Затем меняют ai и ai+1 местами и возобновляют просмотр с ai+1 элемента и т.д. Тем самым наибольшее число передвинется на последнее место. Следующие просмотры опять начинают с начала последовательности, уменьшая количество просматриваемых элементов на 1. Массив будет упорядочен после просмотра, в котором участвовали только первый и второй элементы. Три перечисленных метода часто называют прямыми. В них требуется порядка n*n сравнений. Задание для самостоятельной работы1. Записать алгоритм поиска максимального элемента и его номера в таблице чисел A [1: n]. 2. Записать алгоритмы сортировки в таблице чисел A [1: n]: а) методом выбора; б) методом включений; в) методом обменов. 3. Записать алгоритм подсчета в таблице чисел A[i: n] наибольшего количества расположенных последовательно положительных элементов. 4. Записать алгоритм, проверяющий, является ли последовательность чисел A [1: n] перестановкой чисел 1, 2, ..., n. 5. Дана упорядоченная таблица чисел A [1: n], которая может содержать элементы с одинаковыми значениями. Записать алгоритм, для выяснения того, имеется ли в таблице заданное число К. Если такое число имеется, то найти количество элементов таблицы, равных ему. 6. Дана прямоугольная таблица чисел A[1: n, 1: m]. Составить алгоритм, который определял бы номера строк таблицы, начинающихся с одинаковых чисел, и подсчитывал бы сумму элементов в этих строках. 7. Дана прямоугольная таблица чисел A[1: n, 1: m]. Выяснить, есть ли в этой таблице строки, все элементы которых совпадают. |