Post on 07-Jul-2015
Хакасский государственный университет им. Н.Ф. Катанова
Структуры и алгоритмы обработки данных
Лекция: Сортировка. Часть №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 ← Partition(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
Анализ быстрой сортировки (наихудший случай)
T (n) = Θ(n∑
k=1
c · k) + n ·Θ(1) = Θ(n2 + n) = Θ(n2)
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 Partition(A, p, r)
RandomizedQuickSort(A, p, r)
1 if p < r
2 then q ← RandomizedPartition(A, p, r)
3 RandomizedQuicksort(A, p, q − 1)
4 RandomizedQuicksort(A, q + 1, r)
11
Анализ рандомизированной быстрой сортировки
T (n) = функция имеющая случайный характер. Пусть выборэлемента разделения осуществляется независимым образом.
Введем случайный индикатор: Xk =
1, разделение(k : n− k − 1)
0, иначе
E[Xk] = 0 · Pr {Xk = 0}+ 1 · Pr {Xk = 1} = Pr {Xk = 1} = 1n
12
Анализ рандомизированной быстрой сортировки
T (n) =
T (0) + T (n− 1) + Θ(n), разделение(0 : n− 1)
T (1) + T (n− 2) + Θ(n), разделение(1 : n− 2)
. . .
T (n− 1) + T (0) + Θ(n), разделение(n− 1 : 0)
=n−1∑k=0
Xk(T (k) + T (n− k − 1) + Θ(n))
13
Анализ рандомизированной быстрой сортировки
E[T (n)] = E[n−1∑k=0
Xk(T (k) + T (n− k − 1) + Θ(n))]
= E[Xk] · E[n−1∑k=0
T (k) + T (n− k − 1) + Θ(n))]
=1
n
n−1∑k=0
E[T (k)] +1
n
n−1∑k=0
E[T (n− k − 1)] +1
n
n−1∑k=0
Θ(n)
=2
n
n−1∑k=0
E[T (k)] + Θ(n)
=2
n
n−1∑k=2
E[T (k)] + Θ(n)
14
Анализ рандомизированной быстрой сортировки
Докажем, что E[T (n)] ≤ a · n · log(n), для a− const, a > 0.
Базовый шаг: выберем a, что E[T (n)] ≤ a · n · log(n) длямалого n.
Используем факт, чтоn−1∑k=2
k · log(k) ≤1
2n2log(n)−
1
8n2
15
Анализ рандомизированной быстрой сортировки
Подстановка:
E[T (n)] ≤2
n
n−1∑k=2
a · k · log(k) + Θ(n)
≤2a
n(1
2n2log(n)−
1
8n2) + Θ(n)
= a · n · log(n)− (a · n
4−Θ(n))
≤ a · n · log(n), еслиa · n
4> Θ(n)
16
Наименьшее время сортировки
Теорема. В любом алгоритме, упорядочивающем с помо-щью сравнения пар, на упорядочивание последовательностииз N элементов тратится не меньше c · N · log2N сравненийпри c = 0 и N →∞.
T (n) > c ·N · log2N , при c = 0 и N →∞
17
Наименьшее время сортировки. Доказательство
Число перестановок последовательности из N элементов рав-но N !.
Сортировка путем сравнения пар есть спуск по дереву ре-шений - двоичному, где листья перестановки, а внутренниеузлы условия.
18
Дерево решений сортировки для последовательностииз 3-х элементов
19
Наименьшее время сортировки. Доказательство
N ! ≥(
N2
N2
)
h ≥ log2(N !) ≥ N2 log2
N2 ≥
N4 log2N
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.