2.1.4. Сортировка Шелла
В методе Шелла сравниваются не соседние элементы, а элементы, расположенные на расстоянии d- [n/2] (где d — шаг между сравниваемыми элементами, [ ] — целая часть от числа). После каждого просмотра шаг d уменьшается вдвое. На последнем просмотре он сокращается доd = 1.
Например, пусть дан список, в котором число элементов четно:
{40, 11, 83, 57, 32, 21, 75, 64}.
Список длины и разбивается на n/2 частей, т. е. d= [n/2] = 4.
При первом просмотре сравниваются элементы, отстоящие друг от друга на d= 4, т. е. кх и ks, k2 и к6 и т. д. Если к,> kj+d, то происходит обмен между позициями / и (i+ d). Перед которым просмотром выбирается шагd= [d/2] = 2 . Затем выбираем шагd= [d/2] = 1, т. е. имеем аналогию с методом стандартного обмена.
Сложность метода Шелла — 0(O,3w(log2w)2).
Метод Шелла (шаг d = 4)
Метод Шелла (шаг d= 2)
Метод Шелла (шаг d= 1)
Быстрая сортировка
"Быстрая сортировка", хоть и была разработана более 40 лет назад, является наиболее широко применяемым и одним их самых эффективных алгоритмов.
Метод основан на подходе "разделяй-и-властвуй". Общая схема такова:
из массива выбирается некоторый опорный элемент a[i],
запускается процедура разделения массива, которая перемещает все ключи, меньшие, либо равные a[i], влево от него, а все ключи, большие, либо равные a[i] - вправо,
теперь массив состоит из двух подмножеств, причем левое меньше, либо равно правого,
для обоих подмассивов: если в подмассиве более двух элементов, рекурсивно запускаем для него ту же процедуру.
В конце получится полностью отсортированная последовательность.
Рассмотрим алгоритм подробнее.
Разделение массива
1 На входе массив a[0]...a[N] и опорный элемент p, по которому будет производиться разделение.
2 Введем два указателя: i и j. В начале алгоритма они указывают, соответственно, на левый и правый конец последовательности.
3 Будем двигать указатель i с шагом в 1 элемент по направлению к концу массива, пока не будет найден элемент a[i] >= p. Затем аналогичным образом начнем двигать указатель j от конца массива к началу, пока не будет найден a[j] <= p.
4 Далее, если i <= j, меняем a[i] и a[j] местами и продолжаем двигать i,j по тем же правилам...
Повторяем шаг 3, пока i <= j.
Реализация функции сортировки на Visual Basic
FunctionquickSortR(a,N)
‘ На входе - массив a(), a(N) - его последний элемент.
i = 0: j = N ‘поставить указатели на исходные места
p=a(N\2 ) ‘ центральный элемент
‘ процедура разделения
do
while a(i) < p : i=i+1:wend
while a(j) > p : j=j-1:wend
if i <= j Then temp = a(i): a(i) = a(j): a(j) = temp: i=i+1: j=j-1
loop while while i<=j
End Function
Методы поиска
Предметы (объекты), составляющие множество, называются его элементами. Элемент множества будет называться ключом и обозначаться латинской буквой «к» с индексом, указывающим номер элемента.
Алгоритмы поиска можно разбить на следующие группы
.
Методы поиска
Задача поиска.
Пусть задано множество ключей {кх, к2, к3, ..., к„}.
Необходимо отыскать во множестве ключ к,. Поиск может быть завершен в двух случаях:
ключ во множестве отсутствует;
ключ найден во множестве.
Последовательный поиск
В последовательном поиске исходное множество не упорядочение, т. е. имеется произвольный набор ключей {кх, к2, къ, ..., кп}. Метод заключается в том, что отыскиваемый ключ к, последовательно сравнивается со всеми элементами множества. При этом поиск заканчивается досрочно, если ключ найден.
Бинарный поиск
В бинарном поиске исходное множество должно быть упорядочено по возрастанию. Иными словами, каждый последующий ключ больше предыдущего, т. е.
{k1<=k2<=k3<=...<=kn-1<=kn}
Отыскиваемый ключ сравнивается с центральным элементом множества, если он меньше центрального, то поиск продолжается в левом подмножестве, в противном случае — в правом.
Номер центрального элемента находится по формуле
№ эл-та= [n/2] + 1,
где квадратные скобки обозначают, что от деления берется только целая часть (всегда округляется в меньшую сторону). В методе бинарного поиска анализируются только центральные элементы.
Пример. Дано множество
{7, 8, 12, 16, 18, 20, 30, 38, 49, 50, 54, 60, 61, 69, 75, 79, 80, 81,