
- •Тема 3a. Поиск и сортировка
- •Зачем нужны сортировка и поиск
- •Зачем нужны сортировка и поиск
- •Организация работы с базами данных
- •Для определенности в дальнейшем тип массива записей введем следующим образом
- •Ключ записи, требования к нему
- •Наиболее частыми операциями при работе с базами данных являются «поиск» и «сортировка» записей
- •Поиск в массиве записей
- •Линейный поиск
- •Эффективность Линейного поиска
- •Поиск с барьером
- •Основная идея алгоритма поиска делением пополам в упорядоченном массиве
- •Алгоритм поиска делением пополам
- •Особенность
- •Рекурсивная реализация двоичного поиска
- •Трассировка алгоритма
- •Трассировка алгоритма
- •Эффективность двоичного поиска
- •Сортировка массивов
- •Методы внутренней сортировки массивов характеризуются тем, что все перестановки элементов должны выполняться «на
- •Эффективность сортировки
- •Прямые методы коротки, просто программируются
- •Прямые методы внутренней сортировки можно разбить на три категории
- •Метод прямого обмена
- •Программа метода прямого обмена
- •Трассировка метода пузырька
- •Метод прямого включения
- •Программа метода прямого включения
- •Трассировка метода прямого включения
- •Метод прямого выбора
- •Программа Метода прямого выбора
- •Трассировка метода прямого выбора
- •Двоичный поиск с объектом
- •Двоичный поиск с объектом1
- •Двоичный поиск с объектом3
- •Двоичный поиск с объектом1
- •Контрольные вопросы
- •Задачи на экзамен
- •Задачи на экзамен
- •Конец темы 3
Эффективность сортировки
Методы внутренней сортировки классифицируются по времени их работы.
Хорошей мерой эффективности может быть
число сравнений ключей - С
число пересылок элементов - Р.
Эти числа являются функциями С(n), Р(n) от числа сортируемых элементов n.
Быстрые (но сложные) алгоритмы сортировки требуют
при n порядка n lg2n сравнений т.е. их эффективность O(n lg2n)
Прямые (простые) методы - O(n2).
07/02/19 |
21 |
Прямые методы коротки, просто программируются
Быстрые усложненные методы требуют меньшего числа операций, но эти операции обычно сами более сложны чем у прямых методов
поэтому для достаточно малых n (n<50) прямые методы работают быстрее. Значительное
преимущество быстрых методов (в n/lg(n) раз) начинает проявляться при n>100.
07/02/19 |
22 |
Прямые методы внутренней сортировки можно разбить на три категории
– сортировка с помощью
обмена,
включения,
выбора
07/02/19 |
23 |
Метод прямого обмена
(пузырьковая сортировка)
Для i=1..n-1 выполняется следующий элементарный алгоритм:
начиная от n до i последовательно проверяем упорядоченность двух соседних элементов a[j].k и a[j-1].k, и если они не упорядочены, то меняем их местами.
В результате такого обмена минимальный элемент перемещается на место i
07/02/19 |
24 |
Программа метода прямого обмена
•for i:=1 to n-1 do
• |
for j:=n downto i do |
• |
if a[j-1].k>a[j].k then |
• |
begin |
• |
r:=a[j-1]; |
• |
a[j-1]:=a[j]; |
• |
a[j]:=r; |
• |
end; |
07/02/19 |
25 |
Трассировка метода пузырька
• 8 |
6 2 5 |
1 |
i=1 |
• 8 |
6 2 1 |
5 |
i=1 |
• 8 |
6 1 2 |
5 |
i=1 |
• 8 |
1 6 2 |
5 |
i=1 |
• 1 |
8 6 2 |
5 |
i=2 |
• 1 |
8 6 2 |
5 |
i=2 |
• 1 |
8 2 6 |
5 |
i=2 |
• 1 |
2 8 6 |
5 |
i=3 |
• 1 |
2 8 5 |
6 |
i=3 |
• 1 |
2 5 8 |
6 |
i=4 |
• 1 2 5 6 8
07/02/19 |
26 |

Метод прямого включения
Допустим, что массив a[1..n] разбит на две части
a1...ai-1, ai...an
– в первой части элементы упорядочены, во второй – нет.
При i=2 такое разбиение получается автоматически, т.к. массив из одного элемента тривиально упорядочен.
На каждом шаге i=2..n выполняем элементарный алгоритм:
берем очередной элемент r из неупорядоченной части и включаем его в «нужное» место упорядоченной части.
a1...ai-1, ai...an
Для поиска нужного места в нижеприведенном алгоритме используется барьер a[0].k:=x.
Элементы, начиная от i-1 до нужного j сдвигаются на одну позицию: a[j]:=a[j-1]
07/02/19 |
27 |
Программа метода прямого включения
•for i:=2 to n do
• |
begin |
|
• |
r:=a[i]; //элемент из неупор части |
|
• |
x:=a[i].k;//ключ этого элемента |
|
• |
a[0].k:=x; //барьер |
|
• |
j:=i; |
|
• |
while x<a[j-1].k do //поиск места |
|
• |
begin |
|
• |
a[j]:=a[j-1]; //сдвиг |
|
• |
j:=j-1; |
|
• |
end; |
|
• |
a[j]:=r;//вставка в нужное место |
|
• |
end; |
|
|
07/02/19 |
28 |
Трассировка метода прямого включения
•8 6 2 5 1
• |
6 |
8 |
2 5 1 |
i=2 x=6 x<8 |
|
• |
2 |
6 |
8 5 1 |
i=3 x=2 2<8 2<6 |
|
• |
2 |
5 |
6 8 1 |
i=4 x=5 5<8 |
5<6 |
•1 2 5 6 8 i=5 x=1 1<8 … 1<2
•1 2 5 6 8
•Сравните с методом пузырька.
•Казалось бы меньше итераций, но здесь не показаны проверки при выборе места куда вставить очередной элемент
07/02/19 |
29 |

Метод прямого выбора
Для i=1..n-1 выполняется следующий элементарный
алгоритм: среди неупорядоченной части элементов
ai...an выбираем минимальный am и переставляем местами элементы i-й и m-й.
a1...ai-1, ai…am...an
В результате на первое место станет самый минимальный, на второе – следующий минимальный
и т.д
07/02/19 |
30 |