- •Введение
- •Классификация методов сортировки
- •Основные методы внутренней сортировки
- •Сортировка выбором
- •Сортировка «методом пузырька»
- •Сортировка вставками
- •Улучшенная сортировка простыми вставками
- •Сортировка Шелла
- •Пирамидальная сортировка
- •Шаг 1: построение пирамиды
- •Шаг 2: сортировка
- •Быстрая сортировка
- •Разделение массива
- •Общий алгоритм
- •Модификации кода и метода
- •Поразрядная сортировка
- •Поразрядная сортировка для списков
- •Поразрядная сортировка для массивов
- •Эффективность поразрядной сортировки
- •Результаты тестирования
- •Сравнение времени сортировок
- •Методы внешней сортировки
- •Прямое слияние
- •Естественное слияние
- •Сбалансированное многопутевое слияние
- •Многофазная сортировка
- •Улучшение эффективности внешней сортировки за счет использования основной памяти
- •Библиографический список
- •Оглавление
- •Приложение Классификация методов сортировки
Сортировка выбором
Идея метода состоит в том, чтобы создавать отсортированную последовательность путем присоединения к ней одного элемента за другим в правильном порядке.
Будем строить готовую последовательность, начиная с левого конца массива. Алгоритм состоит из nпоследовательных шагов, начиная от нулевого и заканчивая(n-1)-м.
На i-м шаге выбираем наименьший из элементовa[i] ... a[n]и меняем его местами сa[i].Последовательность шагов приn=5изображена на рис. 4.
|
4
9 7 6 2 3
|
2 9 7 6 4 3 |
2 3 7 6 4 9 | ||||||||||||||||||
|
Исходная последовательность |
Шаг 0: 2 4 |
Шаг 1: 3 9 | ||||||||||||||||||
|
2 3 4 6 7 9 |
2 3 4 6 7 9 |
2 3 4 6 7 9 | ||||||||||||||||||
|
Шаг 2: 4 7 |
Шаг 3: 6 6 |
Шаг 4: 7 7 |
Рис. 4
Вне зависимости от номера текущего шага iпоследовательностьa[0]...a[i](выделена на рисунке курсивом) является упорядоченной. Таким образом, на(n-1)-м шаге вся последовательность, кромеa[n]оказывается отсортированной, аa[n]стоит на последнем месте по праву: все меньшие элементы уже ушли влево.
template<class T>
void selectSort(T a[], long size) {
long i, j, k;
T x;
for( i=0; i < size; i++) { // i - номер текущего шага
k=i; x=a[i];
for( j=i+1; j < size; j++) // цикл выбора наименьшего элемента
if ( a[j] < x ) {
k=j; x=a[j]; // k - индекс наименьшего элемента
}
a[k] = a[i]; a[i] = x; // меняем местами наименьший с a[i]
}
}
Для нахождения наименьшего элемента из n+1рассматриваемых алгоритм совершаетnсравнений. С учетом того, что количество рассматриваемых на очередном шаге элементов уменьшается на единицу, общее количество операций:
n + (n-1) + (n-2) + (n-3) + ... + 1 = 1/2 * (n2+n) =О(n2).
Таким образом, так как число обменов всегда будет меньше числа сравнений, время сортировки растет квадратично относительно количества элементов.
Алгоритм не использует дополнительной памяти: все операции происходят "на месте".
Для определения устойчивости метода рассмотрим последовательность из трех элементов, каждый из которых имеет два поля, а сортировка идет по первому из них (рис. 5).
|
1
a
|
1 b |
1 c |
1 a |
1 b |
1 c | ||||||||||||
|
Исходная последовательность |
Шаг 0: 2 1 | ||||||||||||||||
Рис. 5.
Результат сортировки такой последовательности можно увидеть уже после шага 0, так как больше обменов не будет. Порядок ключей 2a, 2b был изменен на 2b, 2a, поэтому метод неустойчив.
Если входная последовательность почти упорядочена, то сравнений будет столько же, то есть алгоритм ведет себя неестественно.
