Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Algoritmizatsia_i_programmirovanie / Сортировка и поиск Пособие.doc
Скачиваний:
57
Добавлен:
17.03.2015
Размер:
424.45 Кб
Скачать

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,

Соседние файлы в папке Algoritmizatsia_i_programmirovanie