Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Сортировка.docx
Скачиваний:
3
Добавлен:
27.08.2019
Размер:
34.07 Кб
Скачать

Сортировка прямого обмена.

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

Пример: 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

Данный алгоритм можно реализовать простым способом, где будет присутствовать большое количество проходов в «холостую», так же можно реализовать с использованием флага, что позволит сэкономить на числе пустых проходов по массиву и на числе сравнения соседних элементов. Использование флагов в сортировке получило название – шейкерная сортировка.

Эффективность алгоритма сортировки.

Максимальное число сравнений: C­max­=n*(n-1)/2. Максимальное число перемещений: m­max­=3C­max­. Минимальное: m­max­=3C­min­. Сравнительный анализ прямых сортировок показывает, что пузырьковая сортировка представляет собой среднее между сортировками включения и сортировками выбора.

Улучшенные методы сортировки.

Быстрая сортировка (сортировка Хоара).

Данный алгоритм называется сортировкой с разделением, поэтому считается улучшенным методом сортировки. Самый простой случай сортировки, когда n элементов массива расположены в обратном порядке. Данные можно отсортировать, выполнив n/2 шагов, если сначала поменять местами самый левый и самый правый элемент и так далее, двигаясь с 2ух сторон к середине.

Принцип работы быстрой сортировки.

Данные формируются по возрастанию.

  1. Сначала среди элементов выбирается некоторый элемент x, относительно которого будут проводиться последовательные действия

  2. Двигаясь слева на право, ищем элемент меньше x. a<x

  3. Просматриваем массив в правой стороне, пока не найдем элемент a­i1­>x

  4. Далее эти два элемента меняются местами

  5. Процесс повторяется до тех пор, пока данные элементы не встретятся в середине массива

  6. После просмотра массив делится на 2 части. Первая: левая с элементами меньше или равными x. Вторая: С элементами больше или равное x

  7. Процесс повторяется, но уже с первой частью данных, а потом со второй

  8. Процесс повторяется до тех пор, пока данные не будут отсортированы

Способы выбора элемента 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, определяются подпоследовательности, в которых расстояние между элементами равно k­t­. Далее каждая подпоследовательность сортируется методом прямого включения. Применяется принцип уменьшения расстояния между сравниваемыми элементами.

Пример: “fdacbe”

Fdacbe cbafde abcedf результат: abcdef

Эффективность метода.

Объясняется тем, что при каждом проходе используется относительно небольшое число элементов. Или элементы массива находятся в относительном порядке, а упорядоченность увеличивается при каждом новом просмотре данных.

Недостаток метода.

Не всегда можно сказать, что алгоритм дает хороший результат. Не всегда можно быть уверенным в том, что получится хорошо отсортированный массив. Расстояние между элементами может изменяться по разному. Основное условие: последний шаг должен равняться 1. Наиболее выгодные результаты дают шаги: 9,5,3,2,1. Внутренний цикл алгоритма имеет 2 основных условия проверки: х0 и j<=count – необходимо для того, чтобы предотвратить выход за пределы массива, эта проверка ухудшает алгоритм. Основным является нахождение элементов k­t­,k­t-1­,­­k­1­. Свойства:

  • K­t­=1

  • K­t­>k­t-1­, для всех элементов t

  • K­t ­не должны быть кратны друг другу

Пример: 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

Готово