Сортировка последовательностей Методы и алгоритмы Что такое

Скачать презентацию Сортировка последовательностей Методы и алгоритмы  Что такое Скачать презентацию Сортировка последовательностей Методы и алгоритмы Что такое

Сортировка последовательностей.ppt

  • Количество слайдов: 37

>Сортировка последовательностей Методы и алгоритмы Сортировка последовательностей Методы и алгоритмы

>Что такое сортировка?  A[0], A[1], . . . , A[n-1] – последовательность Что такое сортировка? A[0], A[1], . . . , A[n-1] – последовательность Функция сравнения: на любых двух элементах последовательности принимает одно из трех значений: меньше, больше или равно Задача сортировки: переставить члены последовательности, чтобы выполнялось условие A[k]<=A[k+1] для всех k от 0 до n-1.

>  Параметры оценки  алгоритмов  Память: ряд алгоритмов требует выделения дополнительной памяти Параметры оценки алгоритмов Память: ряд алгоритмов требует выделения дополнительной памяти под временное хранение данных (не будем учитывать место, занимаемое исходным массивом и независящие от входной последовательности затраты). Устойчивость: устойчивая сортировка не меняет взаимного расположения равных элементов. Естественность поведения алгоритма: работает быстрее (эффективнее), если сортирует уже отсортированные или частично отсортированные данные.

> Сфера применения  алгоритма Внутренние сортировки: работают с данным в  оперативной памяти Сфера применения алгоритма Внутренние сортировки: работают с данным в оперативной памяти с произвольным доступом. Внешние сортировки: упорядочивают информацию, расположенную на внешних носителях. Дополнительные ограничения на алгоритм: ¢ доступ к носителю осуществляется последовательно, т. е. в каждый момент времени можно считать или записать только элемент, следующий за текущим; ¢ доступ к данным на носителе производится медленнее, чем операции с оперативной памятью.

>  Некоторые алгоритмы сортировки Квадратичные и субквадратичные алгоритмы Сортировка выбором Сортировка пузырьком Сортировка Некоторые алгоритмы сортировки Квадратичные и субквадратичные алгоритмы Сортировка выбором Сортировка пузырьком Сортировка простыми вставками Cортировка Шелла Логарифмические и линейные алгоритмы Пирамидальная сортировка Быстрая сортировка Поразрядная сортировка

>Сравнение времени сортировок   ¢  коричневая линия:    сортировка Сравнение времени сортировок ¢ коричневая линия: сортировка пузырьком; ¢ синяя линия: шейкер- сортировка; ¢ розовая линия: сортировка выбором; ¢ желтая линия: сортировка вставками; ¢ голубая линия: сортировка вставками со сторожевым элементом; ¢ фиолетовая линия: сортировка Шелла.

>   Сортировка выбором  Идея: создаем отсортированную последовательность путем присоединения к ней Сортировка выбором Идея: создаем отсортированную последовательность путем присоединения к ней одного элемента за другим в правильном порядке. На k-м шаге выбираем наименьший из элементов a[k], . . . , a[n] и меняем его местами с a[k]. 0 1 2 3 0 1 2 3 K=0 4 -10 2 0 -10 4 2 0 Наименьший 0 1 2 3 0 1 2 3 K=1 -10 4 2 0 -10 0 2 4 Наименьший

>  Сортировка выбором   0  1 2  3  0 Сортировка выбором 0 1 2 3 0 1 2 3 K=2 -10 0 2 4 -10 0 2 4 Наименьший ИТАК, ПОЛУЧИЛИ: 0 1 2 3 0 1 2 3 4 -10 2 0 -10 0 2 4

>   Сортировка выбором Общее количество сравнений элементов: (n-1) + (n-2) + (n-3) Сортировка выбором Общее количество сравнений элементов: (n-1) + (n-2) + (n-3) +. . . + 1 = (n 2 -n)/2. Число обменов меньше числа сравнений. Время сортировки растет квадратично относительно количества элементов. Алгоритм не использует дополнительной памяти: все операции происходят "на месте". Устойчив ли этот метод? Попробуйте получить ответ самостоятельно. Если входная последовательность почти упорядочена, то сравнений будет столько же, значит алгоритм ведет себя неестественно.

> Сортировка вставками На k-м шаге действия алгоритма последовательность разделена на две части: A[0], Сортировка вставками На k-м шаге действия алгоритма последовательность разделена на две части: A[0], . . . , A[k] – упорядоченная; A[k+1], . . . , A[n-1] - неупорядоченная. На (k+1)-м шаге берем A[k+1] и вставляем на нужное место в готовую часть массива. Поиск подходящего места для очередного элемента входной последовательности осуществляется путем последовательных сравнений с элементом, стоящим перед ним. В зависимости от результата сравнения элемент либо остается на текущем месте (вставка завершена), либо они меняются местами и процесс повторяется.

>  Сортировка вставками Последовательность на текущий   0  1  2 Сортировка вставками Последовательность на текущий 0 1 2 3 4 5 6 момент: A[0], …, A[3] – упорядочена. 0 1 3 4 2 7 9 Вставка числа 2 в отсортированную 0 1 2 3 4 5 6 последовательность. 0 1 3 2 4 7 9 0 1 2 3 4 5 6 ВСТАВКА ЗАВЕРШЕНА 0 1 2 3 4 7 9 В процессе вставки "просеиваем" элемент X к началу массива, останавливаясь в случае, когда: 1) Найден элемент, меньший X или 2) Достигнуто начало последовательности.

>  Сортировка вставками Аналогично сортировке выбором:  Время сортировки растет квадратично относительно количества Сортировка вставками Аналогично сортировке выбором: Время сортировки растет квадратично относительно количества элементов. Дополнительная память не используется. Естественное поведение: почти отсортированный массив будет досортирован очень быстро. Алгоритм устойчив.

>  Сортировка вставками со сторожевым элементом Алгоритм вставками слегка улучшается: Заметим, что на Сортировка вставками со сторожевым элементом Алгоритм вставками слегка улучшается: Заметим, что на каждом шаге внутреннего цикла проверяются 2 условия. Можно объединить из в одно, поставив в начало массива специальный сторожевой элемент - заведомо меньше всех остальных элементов массива. Тогда при j=0 будет заведомо верно A[0] <= x. Цикл остановится на нулевом элементе, что и было целью условия j>=0. Во внутреннем цикле - на одно сравнение меньше. Оно производилось Theta(n 2) раз, т. е. получаем реальное преимущество.

>   Сортировка вставками   (алгоритм пузырька) Расположим массив сверху вниз, от Сортировка вставками (алгоритм пузырька) Расположим массив сверху вниз, от нулевого элемента - к последнему. Идея метода: шаг сортировки состоит в проходе снизу вверх по массиву. По пути просматриваются пары соседних элементов. Если элементы некоторой пары находятся в неправильном порядке, то меняем их местами.

>   Сортировка вставками   (алгоритм пузырька) После нулевого прохода по массиву Сортировка вставками (алгоритм пузырька) После нулевого прохода по массиву "вверху" оказывается самый "легкий" элемент - отсюда аналогия с пузырьком. Следующий проход делается до второго сверху элемента. . . Делаем проходы по все уменьшающейся нижней части массива до тех пор, пока в ней не останется только один элемент.

>  Шейкер-сортировка Алгоритм пузырька: среднее число сравнений и обменов имеют квадратичный порядок роста: Шейкер-сортировка Алгоритм пузырька: среднее число сравнений и обменов имеют квадратичный порядок роста: Theta(n 2). Улучшим его. 1. Ситуация, когда на каком-либо из проходов не произошло ни одного обмена, т. е. массив уже отсортирован. Первое улучшение алгоритма заключается в запоминании, производился ли на данном проходе какой-либо обмен. Если нет - алгоритм заканчивает работу. 2. Процесс улучшения можно продолжить, если запоминать не только сам факт обмена, но и индекс последнего обмена k (все пары соседних элементов с индексами, меньшими k, уже отсортированы). Дальнейшие проходы можно заканчивать на индексе k. 3. Качественно другое улучшение алгоритма пузырька. Хотя легкий пузырек снизу поднимется наверх за один проход, тяжелые пузырьки опускаются со минимальной скоростью: один шаг за итерацию. Так что массив 2 3 4 5 6 1 будет отсортирован за 1 проход, а сортировка последовательности 6 1 2 3 4 5 потребует 5 проходов. Чтобы избежать подобного эффекта, можно менять направление следующих один за другим проходов.

>  Шейкер-сортировка Эффективность метода:  Среднее количество сравнений, хоть и уменьшилось, но остается Шейкер-сортировка Эффективность метода: Среднее количество сравнений, хоть и уменьшилось, но остается O(n 2), в то время как число обменов не поменялось вообще никак. Среднее(оно же худшее) количество операций остается квадратичным. Дополнительная память не требуется. Поведение усовершенствованного (но не начального) метода довольно естественное, почти отсортированный массив будет отсортирован намного быстрее случайного. Сортировка пузырьком устойчива, однако шейкер-сортировка утрачивает это качество.

>  Еще одна сортировка  пузырьком Сортируем массив Arr:    Дайте Еще одна сортировка пузырьком Сортируем массив Arr: Дайте пояснения к for I : = Low(Arr) to High(Arr) - 1 do алгоритму for J : = I + 1 to High(Arr) do if Arr[I] > Arr[J] then begin T : = Arr[I]; Arr[I] : = Arr[J]; Arr[J] : = T; end;

>  Сортировка Шелла   модификация алгоритма сортировки простыми вставками Массив A[0], …, Сортировка Шелла модификация алгоритма сортировки простыми вставками Массив A[0], …, A[15]: . 1. Вначале сортируем простыми вставками каждые 8 групп из 2 -х элементов (A[0], A[8]), (A[1], A[9]), . . . , (A[7], A[15]). 2. Потом сортируем каждую из четырех групп по 4 элемента (A[0], A[4], A[8], A[12]), . . . , (A[3], A[7], A[11], A[15]). В нулевой группе: 4, 12, 13, 18: в первой - 3, 5, 8, 9 и т. п.

>   Сортировка Шелла   ПРОДОЛЖЕНИЕ 3. Далее сортируем 2 группы по Сортировка Шелла ПРОДОЛЖЕНИЕ 3. Далее сортируем 2 группы по 8 элементов, начиная с (A[0], A[2], A[4], A[6], A[8], A[10], A[12], A[14]). 4. В конце сортируем вставками все 16 элементов.

>  Сортировка Шелла Лишь последняя сортировка необходима, чтобы расположить все элементы по своим Сортировка Шелла Лишь последняя сортировка необходима, чтобы расположить все элементы по своим местам. Зачем нужны остальные? Они продвигают элементы максимально близко к соответствующим позициям, так что в последней стадии число перемещений будет весьма невелико: последовательность и так почти отсортирована. Ускорение подтверждено многочисленными исследованиями и на практике оказывается довольно существенным. Единственной характеристикой сортировки Шелла является приращение - расстояние между сортируемыми элементами, в зависимости от прохода. В конце приращение всегда равно единице - метод завершается обычной сортировкой вставками, но именно последовательность приращений определяет рост эффективности.

>   Перевернутая сортировка   выбором Прелюдия к основному методу: перевернутая сортировка Перевернутая сортировка выбором Прелюдия к основному методу: перевернутая сортировка выбором. Вместо вставки наименьшего элемента в левый конец массива вставляем наибольший элемент в правом конце. Пример действий для массива A[0]. . . A[7]: исходный массив 44 55 12 42 94 18 06 67 94 67 44 55 12 42 67 18 06 94 67 06 44 55 12 42 06 18 67 94 55 18 44 18 12 42 06 55 67 94 44 06 18 12 42 44 55 67 94 42 06 18 12 42 44 55 67 94 18 12 06 12 18 42 44 55 67 94

>  Оценка количества операций Выполняется n шагов, каждый из которых состоит в выборе Оценка количества операций Выполняется n шагов, каждый из которых состоит в выборе наибольшего элемента из последовательности A[0], …, A[k] и последующем обмене. Выбор происходит последовательным перебором элементов, поэтому необходимое на него время O(n). Итак, всего O(n 2). Усовершенствование: построим структуру данных, позволяющую выбирать максимальный элемент последовательности за O(logn) времени. Общее быстродействие сортировки будет n*O(logn) = O(n*log n). Эта структура также должна позволять быстро вставлять новые элементы (чтобы быстро ее построить из исходного массива) и удалять максимальный элемент (он будет помещаться в уже отсортированную часть массива - его правый конец).

>   Быстрая (пирамидальная)  сортировка Быстродействие O(n*log n) Пирамида (Heap) - бинарное Быстрая (пирамидальная) сортировка Быстродействие O(n*log n) Пирамида (Heap) - бинарное дерево высоты k, в котором: 1) все узлы имеют глубину k или (k-1), т. е. дерево сбалансированное; 2) этом уровень k-1 полностью заполнен, а уровень k заполнен слева направо. 3) выполняется "свойство пирамиды": каждый элемент меньше, либо равен родителю. Пример:

> Быстрая (пирамидальная)  сортировка Как хранить пирамиду?    Поместим ее в Быстрая (пирамидальная) сортировка Как хранить пирамиду? Поместим ее в массив! Соответствие между геометрической структурой пирамиды как дерева и массивом: 1) A[0] - корень дерева 2) левый и правый наследники элемента A[k] хранятся, соответственно, в A[2 k+1] и A[2 k+2] Для такого массива выполняется характеристическое свойство: A[k] >= A[2 k+1] и A[k] >= A[2 k+2] Плюсы такого хранения пирамиды: никаких дополнительных переменных узлы хранятся от вершины и далее вниз, уровень за уровнем узлы одного уровня хранятся в массиве слева направо

>Быстрая (пирамидальная) сортировка     Запишем в виде массива   Быстрая (пирамидальная) сортировка Запишем в виде массива пирамиду из примера. Слева-направо, сверху-вниз: A[0] = 94 - корень пирамиды K=0 A[1] = 67, A[2] = 18 K=1 A[3] = 44, A[4] = 55 K=2 A[5] = 12, A[6] = 06 K=3 A[7] = 42 Массив: 94 67 18 44 55 12 06 42

>   Пирамидальная сортировка   Фаза 1 сортировки: построение пирамиды Начнем построение Пирамидальная сортировка Фаза 1 сортировки: построение пирамиды Начнем построение пирамиды с A[k], . . . , A[n], k = [size/2]. Эта часть массива удовлетворяет свойству пирамиды, так как не существует индексов i, j: j = 2 i+1 ( или j = 2 i+2 ). . . (такие i, j находятся за границей массива). Нельзя говорить, что A[k], . . . , A[n] является пирамидой как самостоятельный массив (его элементы могут быть любыми). Свойство пирамиды сохраняется лишь в рамках исходного, основного массива A[0], . . . , A[n]. Далее будем расширять часть массива, обладающую этим свойством, добавляя по одному элементу за шаг. Следующий элемент на каждом шаге добавления - тот, который стоит перед уже готовой частью.

>   Пирамидальная сортировка   Фаза 1 сортировки: построение пирамиды Чтобы при Пирамидальная сортировка Фаза 1 сортировки: построение пирамиды Чтобы при добавлении элемента сохранялась пирамидальность, будем использовать следующую процедуру расширения пирамиды A[i+1], …, A[n] на элемент A[i] влево: 1. Смотрим на наследников слева и справа (в массиве это A[2 i+1] и A[2 i+2]) и выбираем наибольшего из них. 2. Если этот элемент больше A[i], меняем его с A[i] местами и идем к шагу 2, имея в виду новое положение A[i] в массиве. Иначе конец процедуры. Новый элемент "просеивается" сквозь пирамиду. Учитывая, что высота пирамиды h <= log n, алгоритм требует O(log n) времени.

>   Пирамидальная сортировка  Фаза 1 сортировки: построение пирамиды Иллюстрация процесса для Пирамидальная сортировка Фаза 1 сортировки: построение пирамиды Иллюстрация процесса для пирамиды из 8 -и элементов Неготовая часть пирамиды (начало массива) окрашена в белый цвет, удовлетворяющий свойству пирамиды. Конец массива - в темный. 1. Выбираем наибольшего наследника 2. Если он больше A[i], меняем его с A[i]

>   Пирамидальная сортировка  Фаза 1 сортировки: построение пирамиды В геометрической интерпретации Пирамидальная сортировка Фаза 1 сортировки: построение пирамиды В геометрической интерпретации ключи из начального отрезка A[size/2], . . . , A[n] является листьями в бинарном дереве. Один за другим остальные элементы продвигаются на свои места, и так - пока не будет построена вся пирамида. Посмотрим преобразование массива: (красный цвет - часть массива, удовлетворяющая свойству пирамиды, остальные элементы добавляются один за другим, справа налево. 44 55 12 42 // 94 18 06 67 >= 42, т. е. меняем 67 и 42 44 55 12 // 67 94 18 06 42 18 = max (18, 6). 18 >= 12, т. е. меняем 18 и 12 44 55 // 18 67 94 12 06 42 94 = max (67, 94). 94 >= 55, т. е. меняем 94 и 55 44 // 94 18 67 55 12 06 42 44 просеиваем сквозь 94, 67 и остановились на 42 // 94 67 18 44 55 12 06 42

>   Пирамидальная сортировка   Фаза 2 сортировки: собственно сортировка Задача построения Пирамидальная сортировка Фаза 2 сортировки: собственно сортировка Задача построения пирамиды из массива решена. Из свойств пирамиды: в корне всегда находится максимальный элемент. Алгоритм фазы 2: 1. Берем верхний элемент пирамиды A[0], . . . , A[n] (первый в массиве) и меняем с последним местами. Теперь "забываем" об этом элементе и далее рассматриваем массив A[0], . . . , A[n-1]. Для превращения его в пирамиду достаточно просеять лишь новый первый элемент. 2. Повторяем шаг 1, пока обрабатываемая часть массива не уменьшится до одного элемента

>Пирамидальная сортировка Фаза 2 сортировки: собственно сортировка    В конец  Пирамидальная сортировка Фаза 2 сортировки: собственно сортировка В конец массива каждый раз попадает максималь ный элемент из текущей пирамиды.

>   Пирамидальная сортировка Быстродействие алгоритма: 1) Построение пирамиды: O(n*log n) операций (более Пирамидальная сортировка Быстродействие алгоритма: 1) Построение пирамиды: O(n*log n) операций (более точная оценка дает O(n), т. к. реальное время выполнения зависит от высоты уже созданной части пирамиды). 2) Вторая фаза занимает O(n*log n) времени: 3) O(n) раз берется максимум и происходит просеивание бывшего последнего элемента. Стабильность метода: среднее число пересылок (n*log n)/2, и отклонения от этого значения сравнительно малы. Не используется дополнительная память. Метод не устойчив: по ходу работы массив так "перетряхивается", что исходный порядок элементов может измениться случайным образом. Поведение неестественно: частичная упорядоченность массива никак не учитывается.

>  Быстрая сортировка  (“разделяй и властвуй”) Общая схема: 1) Из массива выбирается Быстрая сортировка (“разделяй и властвуй”) Общая схема: 1) Из массива выбирается некоторый опорный элемент A[k] 2) Запускается процедура разделения массива, которая перемещает все элементы, меньшие либо равные A[k], влево от него, а все ключи, большие либо равные A[k], - вправо. 3) Для обоих подмассивов: если в подмассиве более двух элементов, рекурсивно запускаем для него ту же процедуру. В конце получится полностью отсортированная последовательность.

>   Быстрая сортировка   (подробнее) Разделение массива: На входе: массив A[0], Быстрая сортировка (подробнее) Разделение массива: На входе: массив A[0], . . . , A[N] и опорный элемент p, по которому будет производиться разделение. 1) Введем два указателя: k и m. В начале алгоритма k, m - соответственно левый и правый конец последовательности. 2) Будем двигать указатель k с шагом в 1 элемент по направлению к концу массива, пока не будет найден элемент A[k] >= p. Затем аналогичным образом начнем двигать указатель m от конца массива к началу, пока не будет найден A[m] <= p. 3) Далее, если k<=m, меняем A[k] и A[m] местами и продолжаем двигать k, m по тем же правилам. 4) Повторяем шаг 3, пока k<=m.

> Быстрая сортировка (пример) 4 9 7 6 2 3 8   Быстрая сортировка (пример) 4 9 7 6 2 3 8 4 9 7 6 2 3 8 Исходное положение Первый обмен k указателей m k m 4 3 7 6 2 9 8 4 3 2 6 7 9 8 k m k m Второй обмен Конец процедуры Разделение завершено

>  Быстрая сортировка Количество шагов деления (глубина рекурсии) - приблизительно log n, если Быстрая сортировка Количество шагов деления (глубина рекурсии) - приблизительно log n, если массив делится на более-менее равные части. Общее быстродействие: O(n*log n). Однако, возможен случай таких входных данных, на которых алгоритм будет работать за O(n 2) операций. Такое происходит, если каждый раз в качестве центрального элемента выбирается максимум или минимум входной последовательности. Если данные взяты случайно, вероятность этого равна 2/n. И эта вероятность должна реализовываться на каждом шаге. . . Это малореальная ситуация. Метод неустойчив. Поведение довольно естественно, если учесть, что при частичной упорядоченности повышаются шансы разделения массива на более равные части. Сортировка использует дополнительную память, так как приблизительная глубина рекурсии составляет O(log n), а данные о рекурсивных подвызовах каждый раз добавляются в стек.