ЛЕКЦИЯ 4. СОРТИРОВКА С ПОМОЩЬЮ ДЕРЕВА
Цель лекции: изучение группы методов сортировки на основе деревовидной структуры данных
Основны расматриваемы вопросы: простой метод сортировки с помощью дерева (турнирная сортировка), пирамидальная сортировка с построением дерева, пирамидальная сортировка на массиве.
Простой метод сортировки с использованием дерева(турнирная сортировка)
Построение дерева начинается с листьев, которые содержат все элементы массива. Из каждой соседней пары выбирается наименьший элемент, и эти элементы образуют следующий (ближе к корню уровень дерева). Из каждой соседней пары выбирается наименьший элемент и т.д., пока не будет построен корень, содержащий наименьший элемент массива. Для того, чтобы получить следующий по величине элемент, спустимся от корня по пути, ведущему к листу с наименьшим значением. В этой листовой вершине проставляется фиктивный ключ с "бесконечно большим" значением, а во все промежуточные узлы, занимавшиеся наименьшим элементом, заносится наименьшее значение из узлов - непосредственных потомков. Процесс продолжается до тех пор, пока все узлы дерева не будут заполнены фиктивными ключами.
Рис. 1.
Рис. 2. Второй шаг
Рис.3. Третий шаг
Рис. 4. Четвертый шаг
Рис.5. Пятый шаг
Рис. 6. Шестой шаг
Рис. 7. Седьмой шаг
Рис. 8. Восьмой шаг
На каждом из n шагов, требуемых для сортировки массива, нужно log n (двоичный) сравнений. Следовательно, всего потребуется nlog n сравнений, но для представления дерева понадобится 2n - 1 дополнительных единиц памяти.
Пирамидальная сортировка
Имеется более совершенный алгоритм, который принято называть пирамидальной сортировкой (Heapsort). Его идея состоит в том, что вместо полного дерева сравнения исходный массив a[1], a[2], ..., a[n] преобразуется в пирамиду, обладающую тем свойством, что для каждого a[i] выполняются условия a[i] <= a[2i] и a[i] <= a[2i+1]. Затем пирамида используется для сортировки.
Массив представляется в виде двоичного дерева, корень которого соответствует элементу массива a[1]. На втором ярусе находятся элементы a[2] и a[3]. На третьем - a[4], a[5], a[6], a[7] и т.д. Для массива с нечетным количеством элементов соответствующее дерево будет сбалансированным, а для массива с четным количеством элементов n элемент a[n] будет единственным (самым левым) листом "почти" сбалансированного дерева.
Рис.9.
Очевидно, что при построении пирамиды нас будут интересовать элементы a[n/2], a[n/2-1], ..., a[1] для массивов с четным числом элементов и элементы a[(n-1)/2], a[(n-1)/2-1], ..., a[1] для массивов с нечетным числом элементов (поскольку только для таких элементов существенны ограничения пирамиды). Пусть i - наибольший индекс из числа индексов элементов, для которых существенны ограничения пирамиды. Тогда берется элемент a[i] в построенном дереве и для него выполняется процедура просеивания, состоящая в том, что выбирается ветвь дерева, соответствующая min(a[2i], a[2i+1]), и значение a[i] меняется местами со значением соответствующего элемента. Если этот элемент не является листом дерева, для него выполняется аналогичная процедура и т.д. Такие действия выполняются последовательно для a[i], a[i-1], ..., a[1]. В результате получим древовидное представление пирамиды для исходного массива.
Рис. 10.
Рис.11.
Рис. 12.
Рис. 13.
Алгоритм Флойда
Флойд предложил метод построения пирамиды без явного построения дерева (хотя метод основан на тех же идеях).
Построение пирамиды методом Флойда.
Начальное состояние массива | 8 23 5 |65| 44 33 1 6 |
Шаг 1 | 8 23 |5| 6 44 33 1 65 |
Шаг 2 | 8 |23| 1 6 44 33 5 65 |
Шаг 3 | |8| 6 1 23 44 33 5 65 |
Шаг 4 | 1 6 8 23 44 33 5 65 1 6 5 23 44 33 8 65 |
В таблице показано, как производится сортировка с использованием построенной пирамиды. Суть алгоритма заключается в следующем. Пусть i - наибольший индекс массива, для которого существенны условия пирамиды. Тогда начиная с a[1] до a[i] выполняются следующие действия. На каждом шаге выбирается последний элемент пирамиды (в нашем случае первым будет выбран элемент a[8]). Его значение меняется со значением a[1], после чего для a[1] выполняется просеивание. При этом на каждом шаге число элементов в пирамиде уменьшается на 1 (после первого шага в качестве элементов пирамиды рассматриваются a[1], a[2], ..., a[n-1]; после второго - a[1], a[2], ..., a[n-2] и т.д., пока в пирамиде не останется один элемент). Легко видеть (это иллюстрируется в таблице), что в результате мы получим массив, упорядоченный в порядке убывания. Можно модифицировать метод построения пирамиды и сортировки, чтобы получить упорядочение в порядке возрастания, если изменить условие пирамиды на a[i] >= a[2i] и a[1] >= a[2i+1] для всех осмысленных значений индекса i.
Исходная пирамида | 1 6 5 23 44 33 8 65 |
Шаг 1 | 65 6 5 23 44 33 8 1 5 6 65 23 44 33 8 1 5 6 8 23 44 33 65 1 |
Шаг 2 | 65 6 8 23 44 33 5 1 6 65 8 23 44 33 5 1 6 23 8 65 44 33 5 1 |
Шаг 3 | 33 23 8 65 44 6 5 1 8 23 33 65 44 6 5 1 |
Шаг 4 | 44 23 33 65 8 6 5 1 23 44 33 65 8 6 5 1 |
Шаг 5 | 65 44 33 23 8 6 5 1 33 44 65 23 8 6 5 1 |
Шаг 6 | 65 44 33 23 8 6 5 1 44 65 33 23 8 6 5 1 |
Шаг 7 | 65 44 33 23 8 6 5 1 |
Процедура сортировки с использованием пирамиды требует выполнения порядка nlog n шагов в худшем случае, что делает ее особо привлекательной для сортировки больших массивов.
Дата добавления: 2018-05-10; просмотров: 1943;