Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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

Хотя идея Шелла значительно улучшает сортировку вставками, резервы еще остаются. Один из наиболее известных алгоритмов сортировки - быстрая сортировка, предложенная Ч.Хоором.

Два предыдущих метода были основаны на принципах вставки и выбора. Пришло время рассмотреть третий, основанный на принципе обмена. Пузырьковая сортировка оказалась наихудшей среди всех трёх простых алгоритмов, однако усовершенствование обменной сортировки даёт лучший из известных методов сортировки массивов.

Построение быстрой сортировки исходит из того, что для достижения максимальной эффективности желательно выполнять обмены между максимально удалёнными позициями. Пусть у нас есть элементов, расставленных в обратном порядке. Можно отсортировать их всего лишь за обменов, сначала обменяв крайний левый и крайний правый элементы, а потом постепенно продвигаясь внутрь массива с обеих сторон. Разумеется, этот метод сработает, только если элементы в массиве упорядочены в обратном порядке. Но тем не менее именно на этой идее построен рассматриваемый метод.

Попробуем реализовать такой алгоритм: случайно выберем любой элемент (назовём его). Будем просматривать массив слева, пока не найдём элемент, а затем справа, пока не найдём элемент Затем выполним обмен двух найденных элементов и будем продолжать такой процесс, пока оба просмотра не встретятся где-то в середине массива. В результате получим массив, разделённый на две части: левую, с ключами меньшими (или равными), и правую с ключами большими (или равными). Сформулируем процесс разделения в виде процедуры:

procedure partition;

var

i,j: integer;

w,x: integer;

begin

i:=1;

j:=n;

// выбрать наугад значение x

REPEAT

while a[i]<x do

i:=i+1;

while x<a[j] do

j:=j-1;

if i<=j then

begin

w:=a[i];

a[i]:=a[j];

a[j]:=w;

i:=i+1;

j:=j-1;

end;

UNTIL i>j;

end;

Теперь вспомним, что наша цель не просто разделить массив, но и отсортировать его. На самом деле от разделения до сортировки всего один небольшой шаг: после разделения массива нужно применить тот же процесс к обеим получившимся частям, затем к частям частей и т.д., пока каждая часть не будет состоять из одного элемента.

procedure sort(L,R: integer);

var

i,j: integer;

w,x: integer;

begin

i:=L;

j:=R;

x:=a[(L+R) div 2];

REPEAT

while a[i]<x do

i:=i+1;

while x<a[j] do

j:=j-1;

if i<=j then

begin

w:=a[i];

a[i]:=a[j];

a[j]:=w;

i:=i+1;

j:=j-1;

end;

UNTIL i>j;

if L<j then

sort(L,j);

if i<R then

sort(i,R);

end;

procedure QuickSort;

begin

sort(1,N);

end;

Чтобы изучить эффективность быстрой сортировки, нужно сначала исследовать поведение процесса разделения. После выбора разделяющего значения просматривается весь массив, поэтому выполнится точно сравнений. Если нам везёт, и в качестве границы всегда выбирается медиана (средний элемент массива), то каждая итерация разбивает массив пополам, и число необходимых проходов равно. Тогда полное число сравнений равно, а полное число обменов равно.

Конечно, нельзя ожидать, что с выбором медианы всегда будет так везти. Строго говоря, вероятность этого. Но показано, что ожидаемая эффективность быстрой сортировки хуже оптимальной только на множитель.

Даже у алгоритма быстрой сортировки есть недостатки. При малых его производительность можно оценить как удовлетворительную, но его преимущество заключается в лёгкости подключения простого метода для обработки сегментов. Ещё остаётся проблема наихудшего случая. Предположим, что каждый раз в качестве разделяющего элемента выбирается наибольшее значение в разделяемом сегменте. Тогда каждый шаг будет разделять фрагмент из элементов на две последовательности из и элементов, соответственно. Очевидно, что в наихудшем случае поведение оценивается величиной. Чтобы избежать наихудшего случая, было предложено выбирать элемент, как медиану из трёх значений разделяемого сегмента. Такое дополнение не ухудшает алгоритм в общем случае, но сильно улучшит его поведение в наихудшем случае.

<== предыдущая лекция | следующая лекция ==>
Эффективные методы сортировки | Основні технічні характеристики радіопередавача рлс
Поделиться с друзьями:


Дата добавления: 2014-01-15; Просмотров: 537; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.