
- •Проверил ______________________ Беляков с.Л.
- •Тема №1 «Тождество, качество программ»
- •Тема №2 «Основные этапы технологии разработки программ»
- •Тема №3 «Исполнение программ вычислительными устройствами»
- •Лекция №5 «Поразрядные операции над числами»
- •Лекция №6 «Передача параметров функциям по значению или по указателю»
- •Лекция №7 «Классы»
- •Лекция №8 «Ввод-вывод информации в файлы».
- •Лекция №9 «Перемещение указателя файла».
- •Лекция №10 «Технология поиска информации»
- •Лекция №11 «Технология поиска»
- •Лекциия №12 «Сортировка»
- •Лекция №13 «Обработка ошибок в работе программ»
- •Лекция №14 «Управление памятью»
- •Лекция №15 «Кодирование и отображение информации»
- •Лекция №16 «Глобальные переменные и пространства имен»
- •Лекция №18 «Тестирование программного кода»
Лекциия №12 «Сортировка»
Сортировка как способ обработки информации заключается в упорядочивании последовательности
X={x1,x2,…,xn}
К(a1,a2)={true, a1<a2; false, a1>a2}
xi,xj, X&i<j->R(xi,xj)=true
C формальной точки зрения, чтобы отсортировать последовательность нужно иметь предикат R(a1,a2), который дает истинное значение если пара сравниваемых элементов находятся в «нужном» порядке и ложное значение если элементы необходимо поменять местами в последовательности. Предикат сравнения может содержать любые операции, которые позволят для конкретной прикладной задачи выразить предпочтения в размещений элементов.
Пузырьковая сортировка
Простейшим алгоритмом сортировки считается пузырьковая. Алгоритм состоит в том, чтобы просматривая последовательно элементы в последовательности сравниваются соседние, и перемещать «большое» в конец последовательности, а меньшее в сторону начала последовательности. Выполнив проход по всей длине последовательности можно убедиться, что в ее начале окажется самый «легкий» элемент. Таким образом, оказывается выполненным первый шаг сортировки. Чтобы поместить на второе место следующий по величине элемент достаточно выполнить описанную процедуру среди оставшихся элементов последовательности. Выполнив эти действия N-1 раз , где N – длина последовательности, получим отсортированную последовательность.
Пузырьковая сортировка по сложности (количеству операций) растет как о(N2). Для больших значений N
оказывается, что время сортировки достаточно значительно. Существует ряд алгоритмов, улучшающий пузырьковую сортировку по времени, но не изменяющих основную тенденцию роста.
Существует семейство алгоритмов сортировки, которые дают результат лучше, чем пузырьковая. Идея этих алгоритмов часто использует принцип «Разделяй и властвуй». Суть принципа в том, что исходная задача разбивается на совокупность более простых, которые решаются с гораздо меньшими затратами и результаты решения частных задач могут быть «простым» образом объединены в результат решения исходных задач.
Алгоритм быстрой сортировки основан на том, что первоначально в последовательности выбирается срединный элемент, относительно него последовательность упорядочивается следующим образом: направо перемещаются большие элементы из левой части, а в левую меньшие. Таким образом, последовательность оказывается частично отсортированной относительно срединного элемента. Описанная процедура применяется для правой и левой части последовательности независимо. Каждая из них приобретает частичную упорядоченность. Применяя тот же алгоритм для получившихся фрагментов добивается с каждым шагом степени отсортированности. Когда фрагмент последовательности содержит 2 элемента достаточно выполнить при необходимости их перестановку. Алгоритм заканчивает свою работу, когда все короткие фрагменты отсортированы. Теоритически показано, что сложность сортировки ведет себя как о(N logN).
Алгоритмы быстрой сортировки не отличаются стабильностью. В зависимости от характера последовательности, режима выбора срединного элемента, время сортировки может в некоторых случаях не отличаться от времени пузырьковой сортировки. Скорость роста о(N logN) характеризует алгоритм в среднем.
Сортировка слиянием представляет собой более стабильный вариант алгоритма и основано на том, чтобы делить исходную последовательность на небольшие фрагменты, сортировать их (возможно пузырьком), а затем последовательно объединять фрагменты в более крупные, но в также отсортированные. Скорость роста сложности о(N logN) в среднем.