Вы находитесь на странице: 1из 30

Методы сортировки массивов

Введение
• Сортировка – упорядочивание данных по некоторому
признаку.
(И.Г.Семакин)
• Сортировка – процесс размещения заданного
множества объектов в определенном порядке
(убывания или возрастания)
(Д.М. Златопольский)
• Сортировка – один из наиболее распространенных
процессов современной обработки информации. Это
распределение элементов множества по группам в
соответствии с определенными правилами.
(Е.В.Андреева)
Метод «пузырька»
• Сортировка пузырьком – простейший
алгоритм сортировки, применяемый чисто
для учебных целей. Практического
применения этому алгоритму нет, так как
он не эффективен, особенно если
необходимо отсортировать массив
большого размера. К плюсам сортировки
пузырьком относится простота реализации
алгоритма.
Метод «пузырька»
• При первом проходе по массиву элементы попарно
сравниваются между собой: первый со вторым, затем второй с
третьим, следом третий с четвертым и т.д. Если
предшествующий элемент оказывается больше последующего,
то их меняют местами.
• Не трудно догадаться, что постепенно самое большое число
оказывается последним. Остальная часть массива остается не
отсортированной, хотя некоторое перемещение элементов с
меньшим значением в начало массива наблюдается.
• При втором проходе незачем сравнивать последний элемент с
предпоследним. Последний элемент уже стоит на своем месте.
Значит, число сравнений будет на одно меньше.
• На третьем проходе уже не надо сравнивать предпоследний и
третий элемент с конца. Поэтому число сравнений будет на два
меньше, чем при первом проходе.
Метод «пузырька»
• В конце концов, при проходе по массиву, когда
остаются только два элемента, которые надо сравнить,
выполняется только одно сравнение.
• После этого первый элемент не с чем сравнивать, и,
следовательно, последний проход по массиву не нужен.
Другими словами, количество проходов по массиву
равно m-1, где m – это количество элементов массива.
• Количество сравнений в каждом проходе равно m-i,
где i – это номер прохода по массиву (первый, второй,
третий и т.д.).
• При обмене элементов массива обычно используется
"буферная" (третья) переменная, куда временно
помещается значение одного из элементов.
Сортировка Шейкером
• Шейкер-сортировка является усовершенствованным
методом пузырьковой сортировки. Анализируя метод
пузырьковой сортировки, можно отметить два
обстоятельства:
• если при движении по части массива перестановки не
происходят, то эта часть массива уже отсортирована и,
следовательно, ее можно исключить из рассмотрения.
• при движении от конца массива к началу минимальный
элемент "всплывает" на первую позицию, а
максимальный элемент сдвигается только на одну
позицию вправо.
• Эти две идеи приводят к модификациям в методе
пузырьковой сортировки.
Сортировка Шейкером
• От последней перестановки до конца (начала) массива
находятся отсортированные элементы. Учитывая
данный факт, просмотр осуществляется не до конца
(начала) массива, а до конкретной позиции. Границы
сортируемой части массива сдвигаются на 1 позицию на
каждой итерации.
• Массив просматривается поочередно справа налево и
слева направо.
• Просмотр массива осуществляется до тех пор, пока все
элементы не встанут в порядке возрастания (убывания).
• Количество просмотров элементов массива
определяется моментом упорядочивания его
элементов.
Сортировка Шейкером
Сортировка вставками
• Сортировка вставками — достаточно простой
алгоритм. Как в и любом другом алгоритме
сортировки, с увеличением размера
сортируемого массива увеличивается и время
сортировки. Основным преимуществом
алгоритма сортировки вставками является
возможность сортировать массив по мере его
получения.То есть имея часть массива, можно
начинать его сортировать. В параллельном
программирование такая особенность играет
не маловажную роль.
Сортировка вставками
• Сортируемый массив можно разделить на две части
— отсортированная часть и неотсортированная. В
начале сортировки первый элемент массива
считается отсортированным, все остальные — не
отсортированные. Начиная со второго элемента
массива и заканчивая последним, алгоритм
вставляет неотсортированный элемент массива в
нужную позицию в отсортированной части массива.
Таким образом, за один шаг сортировки
отсортированная часть массива увеличивается на
один элемент, а неотсортированная часть массива
уменьшается на один элемент. 
Сортировка вставками
шаг Отсортированная часть массива тек.элемент вставка

1 3 3 False

2 3 3 7 False

3 3 3 7 1 True

4 1 3 3 7 7 2 True

5 1 2 3 3 3 7 5 True

6 1 2 3 3 3 5 7 0 True

__ 0 1 2 3 3 3 5 7 ____ ____
Сортировка Шелла
• Сортировка Шелла базируется на методе сортировки
вставками. При неудачном наборе данных может выйти так, что
несколько наименьших элементов массива окажутся
последними, тогда как массив уже почти полностью
отсортирован. В этом случае нам придется сравнивать их почти
со всеми элементами массива. Конечно, такого хотелось бы
избежать. В методе Шелла выполняется сравнение нескольких
элементов, находящихся на заданном расстоянии друг от друга.
Сначала этих элементов для сравнения несколько. Затем
величина этого интервала постепенно сокращается,
увеличивается количество элементов для сравнения, но и
элементы массива уже оказываются почти упорядочены. На
последнем этапе можно выполнить обычную сортировку
вставкой, которая очень эффективна на почти отсортированных
данных.
Сортировка Шелла
Метод прямого выбора
• Алгоритм сортировки прямым выбором в некотором
смысле противоположен сортировке прямыми
включениями.
• При прямом включении на каждом шаге
рассматривается только один очередной элемент
входной последовательности и все элементы готовой
последовательности для нахождения места включения.
• При прямом выборе для поиска одного элемента с
наименьшим ключом просматриваются все элементы
входной последовательности и найденный элемент
помещается как очередной элемент в конец готовой
последовательности.
Метод прямого выбора
• Метод сортировки прямым выбором основан
на следующих правилах:
• Выбирается элемент с наименьшим ключом.
• Он меняется местами с первым элементом a0.
• Затем эти операции повторяются с
оставшимися n-1 элементами, n-2 элементами
и так далее до тех пор, пока не останется
один, самый большой элемент.
Метод прямого выбора
Сортировка методом прямого
включения
• Хотя этот метод сортировки намного менее эффективен,
чем сложные алгоритмы (такие как быстрая
сортировка), у него есть ряд преимуществ:
• прост в реализации;
• эффективен на небольших наборах данных, на наборах
данных до десятков элементов может оказаться
лучшим;
• эффективен на наборах данных, которые уже частично
отсортированы;
• это устойчивый алгоритм сортировки (не меняет
порядок элементов, которые уже отсортированы);
• может сортировать массив по мере его получения;
• не требует временной памяти, даже под стек.
Сортировка методом прямого
включения
• На каждом шаге алгоритма выбираем один
из элементов входных данных и вставляем
его на нужную позицию в уже
отсортированной последовательности до
тех пор, пока набор входных данных не
будет исчерпан. Метод выбора очередного
элемента из исходного массива
произволен; может использоваться
практически любой алгоритм выбора
Сортировка методом прямого
включения
Сортировка слиянием
• Эта сортировка использует следующую
подзадачу: есть два отсортированных
массива, нужно сделать (слить) из них один
отсортированный. Алгоритм сортировки
работает по такому принципу: разбить
массив на две части, отсортировать каждую
из них, а потом слить обе части в одну
отсортированную.
Сортировка слиянием
• Алгоритм сортировки слияниями основан на
многократных слияниях уже упорядоченных групп
элементов массива. Вначале весь массив
рассматривается как совокупность упорядоченных
групп по одному элементу в каждой. Слиянием
соседних групп получаем упорядоченные группы,
каждая из которых содержит два элемента (кроме,
возможно, последней группы которой не нашлось
парной). Далее, упорядоченные группы
укрупняются тем же способом и т.д. 
Сортировка слиянием
Быстрая сортировка
"Быстрая сортировка", хоть и была разработана
более 40 лет назад, является наиболее широко
применяемым и одним их самых эффективных
алгоритмов.
Метод основан на подходе "разделяй-и-властвуй".
Общая схема такова:
• из массива выбирается некоторый опорный
элемент a[i],
• запускается процедура разделения массива,
которая перемещает все ключи, меньшие, либо
равные a[i], влево от него, а все ключи, большие,
либо равные a[i] - вправо,
Быстрая сортировка
• теперь массив состоит из двух
подмножеств, причем левое меньше, либо
равно правого,

• для обоих подмассивов: если в подмассиве


более двух элементов, рекурсивно
запускаем для него ту же процедуру.
В конце получится полностью
отсортированная последовательность.
Быстрая сортировка
• Рассмотрим сортировку на примере массива:
• 10, 4, 2, 14, 67, 2, 11, 33, 1, 15.
• Для реализации алгоритма переупорядочения
используем указатель left на крайний левый
элемент массива. Указатель движется вправо,
пока элементы, на которые он показывает,
остаются меньше разрешающего.
Указатель right поставим на крайний правый
элемент массива, и он движется влево, пока
элементы, на которые он показывает,
остаются больше разрешающего.
Быстрая сортировка
• Пусть крайний левый элемент —
разрешающий. Установим на следующий за
ним элемент; right — на последний.
Алгоритм должен определить правильное
положение элемента 10 и по ходу дела
поменять местами неправильно
расположенные элементы.
Быстрая сортировка
• Движение указателей останавливается, как
только встречаются элементы, порядок
расположения которых относительно
разрешающего элемента неправильный.
• Указатель left перемещается до тех пор,
пока не покажет элемент больше
10; right движется, пока не покажет
элемент меньше 10.
Быстрая сортировка

• Эти элементы меняются местами и


движение указателей возобновляется.
Быстрая сортировка
• Процесс продолжается до тех пор,
пока right не окажется слева от left

• Тем самым будет определено правильное


место разрешающего элемента.
Быстрая сортировка
• Осуществляется перестановка разрешающего
элемента с элементом, на который указывает .

• Разрешающий элемент находится в нужном


месте: элементы слева от него имеют
меньшие значения; справа — большие.
Алгоритм рекурсивно вызывается для
сортировки подмассивов слева от
разрешающего и справа от него.