— сохраняется ли взаимное расположение элементов с одинаковым ключом • Естественность — эффективность метода при обработке уже упорядоченных или частично упорядоченных данных. Алгоритм ведёт себя естественно, если учитывает эту характеристику входной последовательности и работает лучше. • Внутренняя сортировка — работает над данными, целиком помещающимися в память • Внешняя сортировка работает над данными на устройствах с последовательным доступом, которые медленнее, чем память • Сложность
в проходе снизу вверх по массиву. По пути просматриваются пары соседних элементов. Если элементы некоторой пары находятся в неправильном порядке, то меняем их местами. Варианты остановки алгоритма: после N-1 проходов; если за проход не было сделано ни одной перестановки function bubbleSort(a): for i = 0 to n - 2 for j = 0 to n - 2 if a[j] > a[j + 1] swap(a[j], a[j + 1]) Первый проход: (5 1 4 2 8) (1 5 4 2 8), (1 5 4 2 8) (1 4 5 2 8), (1 4 5 2 8) (1 4 2 5 8), (1 4 2 5 8) (1 4 2 5 8), Второй проход: (1 4 2 5 8) (1 4 2 5 8), (1 4 2 5 8) (1 2 4 5 8), (1 2 4 5 8) (1 2 4 5 8), Третий проход: (1 2 4 5 8) (1 2 4 5 8) (1 2 4 5 8) (1 2 4 5 8)
1. Перебираются элементы в неотсортированной части массива. 2. Каждый элемент вставляется в отсортированную часть массива на то место, где он должен находиться.
почти упорядоченных массивов • Лучший случай • Худший случай • Оценка памяти • Устойчивость • Естественность Процедура InsertionSort(A: массив, min - начальный индекс, max - конечный индекс); Начало Цикл для i от min+1 до max j=i tmp=Ai ; //запоминаем значение ещё неотсортированного элемента цикл пока (j>min и Aj-1 >tmp): //Сравниваем очередной отсортированный элемент, если он больше, 1. Aj =Aj-1 //то сдвигаем его в большую сторону, освобождая место для вставки 2. j=j-1 //Переходим к следующему элементу в отсортированной части массива Aj =tmp; //Место для нового элемента определено - вставляем его туда Конец процедуры 𝒏 𝒏𝟐 Да 1 Да
оптимальную схему выбора шагов. Дональд Кнут провел множество экспериментов и нашел следующую формулу выбора шагов h для массива длины N: в последовательности ℎ1 = 1, ℎ𝑠+1 + 1 = 3ℎ𝑠 + 1, ... взять ℎ𝑡, если ℎ𝑡+2 ≥ 𝑁. Вот несколько первых значений h: h 1 = 1 h 2 = (3 x 1) + 1 = 4 h 3 = (3 x 4) + 1 = 13 h 4 = (3 x 13) + 1 = 40 h 5 = (3 x 40) + 1 = 121
• Худший случай 𝒏𝟑/𝟐 • Оценка памяти 1 • Устойчивость Нет • Естественность Особенности: мало кода, довольно быстра, не вырождается до квадратичной. Шаг 0. 𝑖 = 𝑡 Шаг 1. Разобьем массив на списки элементов, отстающих друг от друга на ℎ𝑖 . Таких списков будет ℎ𝑖 . Шаг 2. Отсортируем элементы каждого списка сортировкой вставками. Шаг 3. Объединим списки обратно в массив. Уменьшим 𝑖. Если 𝑖 неотрицательно — вернемся к шагу 1 Конец.
Общая схема такова: 1. из массива выбирается некоторый опорный элемент a[i] (идеально – медиана, но её вычисление слишком трудоёмко для сортировки). 2. запускается процедура разделения массива, которая перемещает все ключи, меньшие, либо равные a[i], влево от него, а все ключи, большие, либо равные a[i] – вправо. 3. теперь массив состоит из двух подмножеств, причем левое меньше, либо равно правого 4. для обоих подмассивов: если в подмассиве более двух элементов, рекурсивно запускаем для него ту же процедуру. В конце получится полностью отсортированная последовательность.
𝒏 • Средний случай 𝒏 log 𝒏 • Худший случай 𝒏𝟐 • Оценка памяти log 𝒏 • Устойчивость Нет • Естественность Нет Быстрая сортировка является наиболее широко применяемым и одним их самых эффективных алгоритмов, обычно лежит в основе библиотечных реализаций сортировок.
властвуй»: задача разбивается на подзадачи меньшего размера, которые решаются по отдельности, после чего их решения комбинируются для получения решения исходной задачи. 1. Если в рассматриваемом массиве один элемент, то он уже отсортирован — алгоритм завершает работу. 2. Иначе массив разбивается на две части, которые сортируются рекурсивно. 3. После сортировки двух частей массива к ним применяется процедура слияния, которая по двум отсортированным частям получает исходный отсортированный
𝒏 • Средний случай 𝒏 log 𝒏 • Худший случай 𝒏 log 𝒏 • Оценка памяти 𝒏 • Стабильность Нет Особенности: • можно написать эффективную многопоточную сортировку слиянием; • сортировка данных, расположенных на периферийных устройствах и не вмещающихся в оперативную память.