Сортировка прямого обмена.
Данный алгоритм сортировки основывается на смене мест для пары соседних элементов и продолжается до тех пор, пока не будут упорядочены все элементы. В сортировке повторяются проходы по массивам, каждый раз сдвигая наименьший элемент к левому краю массива.
Пример: 10,3,11,8,2,15,44,9
Шаг |
Готовая последовательность |
Исходная последовательность |
1 |
10,3,11,8,2,15,9,44 |
44 и 9 |
2 |
10,3,11,8,2,9,15,44 |
9 и 15 |
3 |
10,3,11,2,8,9,15,44 |
2 и 8 |
4 |
10,3,2,11,8,9,15,44 |
2 и 11 |
5 |
10,2,3,11,8,9,15,44 |
2 и 3 |
6 |
2,10,3,11,8,9,15,44 |
2 и 10 |
7 |
2,10,3,8,11,9,15,44 |
8 и 11 |
8 |
2,10,3,8,9,11,15,44 |
9 и 11 |
9 |
2,3,10,8,9,11,15,44 |
3 и 10 |
10 |
2,3,8,10,9,11,15,44 |
8 и 10 |
11 |
2,3,8,9,10,11,15,44 |
9 и 10 |
Данный алгоритм можно реализовать простым способом, где будет присутствовать большое количество проходов в «холостую», так же можно реализовать с использованием флага, что позволит сэкономить на числе пустых проходов по массиву и на числе сравнения соседних элементов. Использование флагов в сортировке получило название – шейкерная сортировка.
Эффективность алгоритма сортировки.
Максимальное число сравнений: Cmax=n*(n-1)/2. Максимальное число перемещений: mmax=3Cmax. Минимальное: mmax=3Cmin. Сравнительный анализ прямых сортировок показывает, что пузырьковая сортировка представляет собой среднее между сортировками включения и сортировками выбора.
Улучшенные методы сортировки.
Быстрая сортировка (сортировка Хоара).
Данный алгоритм называется сортировкой с разделением, поэтому считается улучшенным методом сортировки. Самый простой случай сортировки, когда n элементов массива расположены в обратном порядке. Данные можно отсортировать, выполнив n/2 шагов, если сначала поменять местами самый левый и самый правый элемент и так далее, двигаясь с 2ух сторон к середине.
Принцип работы быстрой сортировки.
Данные формируются по возрастанию.
Сначала среди элементов выбирается некоторый элемент x, относительно которого будут проводиться последовательные действия
Двигаясь слева на право, ищем элемент меньше x. a<x
Просматриваем массив в правой стороне, пока не найдем элемент ai1>x
Далее эти два элемента меняются местами
Процесс повторяется до тех пор, пока данные элементы не встретятся в середине массива
После просмотра массив делится на 2 части. Первая: левая с элементами меньше или равными x. Вторая: С элементами больше или равное x
Процесс повторяется, но уже с первой частью данных, а потом со второй
Процесс повторяется до тех пор, пока данные не будут отсортированы
Способы выбора элемента X.
Это может быть центральный элемент последовательности, или первый элемент.
Пример: 34,17,45,9,6,18,12,14,37,49,5.
Выбираем элемент x=18. Из левой части выбираем элемент, который больше 18 (34), из правой части элемент, который меньше 18 (5). Меняем их местами: 5,17,45,9,6,18,12,14,37,49,34. 5,17,14,9,6,18,12,45,37,49,34. 5,(17),14,9,(6),12|18,(45),37,49,(34)
5,6,14,9,17,12|18,34,37,49,45.
Пример: 4,12,32,7,15,24,70,14,36.
Шаг |
Последовательность |
х |
Меняем |
1 |
16,2,9,27,3,34,11 |
27 |
3 - 16 |
2 |
16,2,9,3,27,34,11 |
3 |
16 |
3 |
2,9,3,11,16,27,34 |
|
|
4 |
2,3,9,11,16,27,34 |
|
|
Шаг |
Последовательность |
х |
Меняем |
1 |
34,11,45,9,6,18,12,14,37,49,5,34 |
18 |
14 – 46 |
2 |
5,17,14,9,6,18,12,45,37,49,34 |
18 |
12 |
3 |
5,17,14,9,6,12,18,45,37,49,34 |
14 |
12 – 17 |
4 |
5,12,14,9,6,17,18,45,37,49,34 |
14 |
16 |
5 |
5,12,6,14,9,17,18,45,37,49,34 |
14 |
|
6 |
5,6,12,14,17,18,45,37,49,34 |
6 |
12 |
7 |
5,6,12,14,17,18, |
|
|
Шаг |
Последовательность |
х |
Меняем |
1 |
26,9,17,1,29,34,46,5,12 |
29 |
|
2 |
12,9,17,1,29,34,46,5,26 |
5 |
|
3 |
12,9,17,1,5,29,34,46,26 |
26 |
|
4 |
12,9,17,1,5,26,34,46 |
9 |
|
5 |
1,9,17,12,5,26,34,46 |
|
|
6 |
1,5,9,17,12,26,34,46 |
|
|
7 |
1,5,9,12,17,26,34,46 |
|
|
Шаг |
Последовательность |
х |
Меняем |
1 |
20,17,34,9,25,4,47,1,23 |
|
|
2 |
20,17,23,9,25,4,47,1,34 |
|
|
3 |
20,17,23,9,1,25,4,47,34 |
|
|
4 |
20,17,23,9,1,4,25,47,34 |
|
|
5 |
4,17,23,9,1,25,47,34 |
|
|
6 |
4,1,17,23,9,25,47,34 |
|
|
7 |
4,1,9,17,23,25,47,34 |
|
|
8 |
1,4,9,17,23,25,47,34 |
|
|
9 |
1,4,9,17,23,25,34,47 |
|
|
Шаг |
Последовательность |
х |
Меняем |
1 |
20,17,34,12,0,5,14,7,1,23 |
|
|
2 |
1,17,34,12,0,5,14,7,20,23 |
|
|
3 |
1,34,12,0,5,17,14,7,20,23 |
|
|
4 |
1,12,0,5,34,17,14,7,20,23 |
|
|
5 |
1,0,5,12,34,17,14,7,20,23 |
|
|
6 |
0,1,5,12,34,17,14,7,20,23 |
|
|
7 |
0,1,5,7,17,14,34,20,23 |
|
|
8 |
0,1,5,7,14,17,34,20,23 |
|
|
9 |
0,1,5,7,14,17,20,34,23 |
|
|
10 |
0,1,5,7,14,17,20,23,34 |
|
|
Сортировка Шелла
Сортировка Шелла относится к улучшенным методам сортировки. Основной принцип сортировки: на каждом шаге произвести определенные действия. Допустим у нас имеется некая t, определяются подпоследовательности, в которых расстояние между элементами равно kt. Далее каждая подпоследовательность сортируется методом прямого включения. Применяется принцип уменьшения расстояния между сравниваемыми элементами.
Пример: “fdacbe”
Fdacbe cbafde abcedf результат: abcdef
Эффективность метода.
Объясняется тем, что при каждом проходе используется относительно небольшое число элементов. Или элементы массива находятся в относительном порядке, а упорядоченность увеличивается при каждом новом просмотре данных.
Недостаток метода.
Не всегда можно сказать, что алгоритм дает хороший результат. Не всегда можно быть уверенным в том, что получится хорошо отсортированный массив. Расстояние между элементами может изменяться по разному. Основное условие: последний шаг должен равняться 1. Наиболее выгодные результаты дают шаги: 9,5,3,2,1. Внутренний цикл алгоритма имеет 2 основных условия проверки: х0 и j<=count – необходимо для того, чтобы предотвратить выход за пределы массива, эта проверка ухудшает алгоритм. Основным является нахождение элементов kt,kt-1,k1. Свойства:
Kt=1
Kt>kt-1, для всех элементов t
Kt не должны быть кратны друг другу
Пример: 9,74,62,5,81,3,14,15,44,30,16,7,22,41,56,25,1,90. Всего массив содержит 18 элементов. Кнут предложил две «хорошие» последовательности расстояния: 1,4,13,40,121,_(kt=1+3*kt-1). 1,3,7,15,31,_(kt=1+2*2kt-1=2t-1). Первая последовательность подходит для сортировок длинных массивов, вторая для сортировки коротких.
Как определить начальное значение для t? Можно поочередно вычленять последовательности с расстояниями 1,3,7,15 и т.д. между ее элементами. Используя формулу: kt=2t-1. Учитывая, что длинна массива должна попадать в рамки: kt<N-1<kt+1, 2t<N<2t+1
Прологарифмируем неравенства: t<=logN<t+1. Следовательно tвычисляется по формуле: t=trunc(logN).
Из второй последовательности, предложенной Кнутом, выбираем количество шагов t=3, которые будут равны: 7,3,1. Сначала выбираем подпоследовательности, где шаг между элементами будет равен 1, их будет семь. Первый элемент подпоследовательности будет равен 9, первый элемент второй подпоследовательности 74, третьей 62 и т.д. К каждой такой подпоследовательности применяется метод прямого включения. Выбираем 3 подпоследовательности с шагом 3 и сортируем их методом прямого включения. Сортируем весь массив методом прямого включения, так как шаг равен 1.
№ |
Массив, подпоследовательности |
Переста новка |
|
9,74,62,5,81,3,14,15,44,30,16,7,22,41,56,25,1,90 |
|
1 |
9 15 56 |
нет |
2 |
74 44 25 |
|
|
44 74 25 |
|
|
25 44 74 |
|
3 |
62 30 1 |
|
|
30 62 1 |
|
|
1 30 62 |
|
4 |
5 16 90 |
|
5 |
81 7 |
|
|
7 81 |
|
6 |
3 22 |
|
7 |
14 41 |
нет |
|
9,25,1, |
|
№ |
Массив, подпоследовательности |
Переста новка |
|
9,74,62,5,81,3,14,15,44,30,16,7,22,41,56,25,1,90 |
|
1 |
9 5 14 30 22 74 |
Да |
|
5 9 14 30 22 74 |
Да |
|
5 9 14 22 30 74 |
Нет |
2 |
25 7 15 16 41 62 |
Да |
|
7 25 15 16 41 62 |
Да |
|
7 15 25 16 41 62 |
Да |
|
7 15 |
Нет |
5 |
|
Да |
|
|
Нет |
6 |
|
Готово |