Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Быстрая сортировка Хоара






Недостатком метода «пузырька» является то, что элементы переставляются на очень маленькое расстояние. Более мощным является алгоритм Хоара. Он позволяет перекинуть элементы на большее расстояние. Это улучшенный алгоритм обменной сортировки.

... ai...x... aj...

обмен

 

a1, a2, … ak–1, ak, ak+1, an–1, an

       
   


i j

ai > ak aj < ak

 

В результате первого просмотра выбираем центральный элемент и обозначим его x. В левой части ищем элементы больше x, а в правой – меньше. Затем левая и правая половинки тоже делятся пополам и процесс повторяется вновь для каждой половинки. Процесс будет продолжаться до тех пор, пока i > j. Это рекурсивный алгоритм, в основе которого лежит разделение.

Выбираем x: = a [ k ]

i: = 1; j: = n;

Repeat

while a i < x do inc (i);

while a j > x do dec (j);

if i < = j then

Begin

b: = a [ i ]; a [ i ]: = a [ j ]; a [ j ]: = b;

inc (i);

dec (j);

end;

until i > j;

Потом этот алгоритм применяется отдельно к левой и правой части и получаем рекурсивный алгоритм.

Алгоритм:

procedure QuickSort;

procedure Sort (l, r: integer); { l, r – левая и правая границы помассива}

var i, j, k: integer;

x, b: typel;

Begin

k: = (l + r) div 2; { полусумма границы}

x: = a [ k ]; i: = l; j: = r; {по i –слева, по j – справа}

repeat {т.к. многократно}

while a [ i ] < x do i: = i +1;

while a [ j ] > x do j: = j +1;

if i < = j then

begin b: = a [ i ]; a [ i ]: = a [ j ];

a [ j ]: = b; i: = i + 1; j: = j – 1;

end;

until i > j;

if i < r then Sort (i, r);

* if j > l then Sort (l, j);

end;

begin Sort (1, n)

end.

Если ak оказался максимальным, он перейдет до конца вправо, то будет существовать только левый массив и выполняться только условие *.

Оценка алгоритма: На каждом шаге мы всегда просматриваем i-элементов, а значит и n-операций. В качестве элемента ak(x) нам удается выбирать элемент, который занимает среднее значение из всех элементов массива.

Предположим, что a k – медиана – это элемент массива, который обладает следующим свойством:

· количество элементов больше и меньше медианы на 1 (элементы большие и меньшие a k отличаются на единицу).

· при делении элемент не перемещается (этот средний элемент при проверке никуда не перемещается – он посередине).

На каждом шаге уменьшаем размерность задачи в два раза. В этом случае число шагов (n) для a k медианы имеет: T n = O (n log 2 n), не более чем n /2 перемещений.

log 2 n – оценка разбивания массива (дихотомия)

Оценка алгоритма: T n = O (n log 2 n)

Во всех случаях мы имеем оценку n log 2 n.

Теоретические исследования показали, что во всех случаях простой случай поиска a k является верным и удобным.

Но существует другая ситуация, которая изменяет оценку алгоритма (min и max) то оценка: n 2.

Можно вставить алгоритм поиска медианы, тогда оценка будет a log 2 n, где a – коэффициент. Число шагов не изменится. Но нет необходимости искать медиану, т.к. и этот алгоритм имеет хорошую оценку.

Если ak взять как максимальное (минимальное), то оценка превращается в n 2.

Алгоритм n 1, 2(алг. Шелла) и n 2 – они логически сложны. На практике алгоритм с оценкой n 2 дает лучший результат.

Таким образом самым лучшим из простых является метод простого выбора. Наихудшим алгоритмом является метод простого обмена.

Лучшим из улучшенных простых является метод быстрой сортировки, основанный на рекурсии.


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.007 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал