Лекция №10. Сортировка. Часть №2. Предмет "Структуры и алгоритмы обработки данных" - Presentation Transcript
Хакасский государственный университет им. Н.Ф. Катанова
Структуры и алгоритмы обработки данных
Лекция: Сортировка. Часть №2.
Николай Гребенщиков, www.grebenshikov.ru
Сортировка с разделением (быстрая сортировка)
1. Разделяем массив на два подмассива [1 . . . m] и [m + 1 . . . N ],
причем ∀i, j : 1 ≤ i ≤ m ∧ m < j ≤ N ⇒ ai ≤ aj
2. Рекурсивно сортируем получившиеся два подмассива.
m называется медианой.
1
Алгоритм быстрой сортировки
QuickSort(A, p, r)
1 if p < r
2 then q ← P artition(A, p, r)
3 Quicksort(A, p, q − 1)
4 Quicksort(A, q + 1, r)
2
Алгоритм разделения в быстрой сортировке
Partition(A, p, r)
1 x ← A[r]
2 i←p−1
3 for j ← p to r − 1
4 do if A[i] ≤ x
5 then i ← i + 1
6 Обменять A[i] ↔ A[j]
7 Обменять A[i + 1] ↔ A[r]
8 return i + 1
3
Алгоритм быстрой сортировки на С
4
Работа быстрой сортировки (1 из 2)
5
Работа быстрой сортировки (2 из 2)
6
Анализ быстрой сортировки (наихудший случай)
Предположим, что все элементы различны.
Наихудший случай: когда при разделении один из массивов
не имеет элементов.
T (n) = T (0) + T (n − 1) + Θ(n)
= Θ(1) + T (n − 1) + Θ(n)
= T (n − 1) + Θ(n)
= Θ(n2)
C(N ) = M (N )
7
Анализ быстрой сортировки (наихудший случай)
n
T (n) = Θ( c · k) + n · Θ(1) = Θ(n2 + n) = Θ(n2)
k=1
8
Анализ быстрой сортировки (наилучший случай)
Наилудший случай: когда при разделении массив разделяет-
ся на равные части.
T (n) = 2T (n/2) + Θ(n)
= Θ(n · log(n))
9
Рандомизированная быстрая сортировка
• Время работы не зависит от порядка элементов во вход-
ных данных.
• Не нужно предположений о распределении входных дан-
ных.
• Нет входных данных, которые приводят к наихудшему
случаю.
• Наихудший случай определяется только генератором слу-
чайных чисел.
10
Рандомизированная быстрая сортировка
Выбираем граничный элемент случайным образом!
RandomizedPartition(A, p, r)
1 i ← Random(p, r)
2 Обменять A[r] ↔ A[i]
3 return P artition(A, p, r)
RandomizedQuickSort(A, p, r)
1 if p < r
2 then q ← RandomizedP artition(A, p, r)
3 RandomizedQuicksort(A, p, q − 1)
4 RandomizedQuicksort(A, q + 1, r)
11
Анализ рандомизированной быстрой сортировки
T (n) = функция имеющая случайный характер. Пусть выбор
элемента разделения осуществляется независимым образом.
1, разделение(k : n − k − 1)
Введем случайный индикатор: Xk =
0, иначе
1
E[Xk ] = 0 · P r {Xk = 0} + 1 · P r {Xk = 1} = P r {Xk = 1} = n
12
Анализ рандомизированной быстрой сортировки
T (0) + T (n − 1) + Θ(n),
разделение(0 : n − 1)
T (1) + T (n − 2) + Θ(n),
разделение(1 : n − 2)
T (n) =
. . .
T (n − 1) + T (0) + Θ(n), разделение(n − 1 : 0)
n−1
= Xk (T (k) + T (n − k − 1) + Θ(n))
k=0
13
Анализ рандомизированной быстрой сортировки
n−1
E[T (n)] = E[ Xk (T (k) + T (n − k − 1) + Θ(n))]
k=0
n−1
= E[Xk ] · E[ T (k) + T (n − k − 1) + Θ(n))]
k=0
n−1
1 1 n−1 1 n−1
= E[T (k)] + E[T (n − k − 1)] + Θ(n)
n k=0 n k=0 n k=0
2 n−1
= E[T (k)] + Θ(n)
n k=0
2 n−1
= E[T (k)] + Θ(n)
n k=2
14
Анализ рандомизированной быстрой сортировки
Докажем, что E[T (n)] ≤ a · n · log(n), для a − const, a > 0.
Базовый шаг: выберем a, что E[T (n)] ≤ a · n · log(n) для
малого n.
n−1
1 2 1
Используем факт, что k · log(k) ≤ n log(n) − n2
k=2
2 8
15
Анализ рандомизированной быстрой сортировки
Подстановка:
2 n−1
E[T (n)] ≤ a · k · log(k) + Θ(n)
n k=2
2a 1 2 1
≤ ( n log(n) − n2) + Θ(n)
n 2 a8 n
·
= a · n · log(n) − ( − Θ(n))
4 ·n
a
≤ a · n · log(n), если > Θ(n)
4
16
Наименьшее время сортировки
Теорема. В любом алгоритме, упорядочивающем с помо-
щью сравнения пар, на упорядочивание последовательности
из N элементов тратится не меньше c · N · log2N сравнений
при c = 0 и N → ∞.
T (n) > c · N · log2N , при c = 0 и N → ∞
17
Наименьшее время сортировки. Доказательство
Число перестановок последовательности из N элементов рав-
но N !.
Сортировка путем сравнения пар есть спуск по дереву ре-
шений - двоичному, где листья перестановки, а внутренние
узлы условия.
18
Дерево решений сортировки для последовательности
из 3-х элементов
19
Наименьшее время сортировки. Доказательство
N
N! ≥ N2
2
h ≥ log2(N !) ≥ N log2 N ≥ N log2N
2 2 4
20
Сортировка за линейное время. Сортировка подсчетом
• Все n входных элементов - целые числа, пренадлежащие
[0, k], где k - целая константа.
• Если k = O(n), то T (n) = Θ(n)
21
Сортировка подсчетом
CountingSort(A, B, k)
1 for i ← 0 to k
2 do C[i] ← 0
3 for j ← 1 to length[A]
4 do C[A[j]] ← C[A[j]] + 1
5 £ В C[i] хранится количество элементов равных i
6 for i ← 1 to k
7 do C[i] ← C[i] + C[i − 1]
8 £ В C[i] хранится количество элементов не превышающих i
9 for j ← length[A] downto 1
10 do B[C[A[j]]] ← A[j]
11 C[A[j]] ← C[A[j]] − 1
22
Сортировка подсчетом
Визуализация?
23
Сортировка за линейное время
На семинар:
• Поразрядная сортировка
• Карманная сортировка
24
Список литературы
• Цикова В.А., Чурина Т.Г. Методы программирования: пе-
рестановки, поиск и сортировка: Учеб. пособие / Ново-
сиб. гос. ун-т. Новосибирск, 2006. Ч.2. 58 с. сс.42-47.
• Ахо А., Хопкрофт Д., Ульман Д. Структуры данных и
алгоритмы. - М. : Издательский дом “Вильямс”, 2000.
сс.235-257.
• Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгорит-
мы: построение и анализ, 2-е издание. - М. : Издатель-
ский дом “Вильямс”, 2007. сс.198-239.
25
• Кнут Д, Искусство программирования, том 3. Сортировка
и поиск, 2-е изд. - М. : Издательский дома “Вильямс”,
2000. сс.192-203.
0 comments
Post a comment