Студопедия — Быстрая сортировка
Студопедия Главная Случайная страница Обратная связь

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

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






 

Для достижения наибольшей эффективности при сортировке Ч.Хоар предложил обеспечить обмен элементов на больших расстояниях.

Идея быстрой сортировки Ч. Хоара такова: в последовательности сортируемых элементов (а1,…,an) выберем наугад какой-нибудь элемент (назовем его Х); будем просматривать слева нашу последовательность до тех пор, пока не найдем элемент аі> X; потом будем просматривать последовательность справа, пока не встретим aj< X; поменяем местами эти два элемента и продолжим процесс просмотра и обмена, пока эти два просмотра не встретятся в середине последовательности. В результате этого последовательность будет разбита на левую часть, которая имеет ключи меньшие (или равные) Х, и правую – с ключами большими (или равными) Х. Сортировку от распределения отделяет только небольшой шаг: необходимо применить этот процесс разбиения к получившимся двум частям, потом к частям частей, и так до тех пор, пока каждая из частей не будет состоять из одного элемента.

Описание алгоритма быстрой сортировки имеет вид:

1. В последовательности элементов А =(а1,…,an) выбрать элемент Х.

2. Просматривая последовательность А слева направо, найти элемент аi < Х.

3. Просматривая последовательность А справа налево, найти элемент ак >= Х.

4. Поменять местами элементы а і и а k. Продолжить процесс встречного просмотра и обмена, пока два просмотра не встретятся где-то внутри последовательности элементов А. Если down >= up, то поменять местами Х и а up, где down – текущий индекс при движении слева направо,

5. а up - текущий индекс при движении справа налево. В результате элемент Х помещается в позицию j и выполнятся следующие условия: - элементы в позициях с 1-й по (j -1)-ю меньше (равны) Х, - элементы в позициях с (j +1)-й по n -ю, больше (равны) Х. То есть элемент Х является j -м наименьшим элементом в последовательности А и Х останется в позиции j и когда последовательность А будет полностью отсортирована.

6. Применить пункты 1,..,5 к подпоследовательностям (а 1,…, a j) (а j-1,…, a n) и так далее, пока каждая из подпоследовательностей не будет состоять из одного элемента.

Первая часть процесса быстрой сортировки для последовательности А =(11, 7, 4, 49, 9, 18, 2, 5, 11) показана в табл. 3, в качестве элемента разбиения Х выбран элемент а5.

Таблица 3 Пример быстрой сортировки

Шаг Состояние последовательности
1.                  
2.                  
3.                  

 

В примере Х = а 5=9. Так как а 1=11> Х, а а 8=5< Х, то они меняются местами, что и показано во второй строке таблицы 1. Так как а 4=49> Х, а а 7=2< Х, то они тоже меняются местами, что и показано в третьей строке таблицы 1. Третья строка таблицы 1 также показывает, что элемент Х = а 5=9 находится в своем окончательном месте и разделяет последовательность А на две подпоследовательности: с элементами меньше (равно) Х – (5, 7, 4, 2) и с элементами больше (равно) Х – (18, 49, 11, 11). Далее процесс сортировки необходимо аналогично применить к этим подпоследовательностям.

Для выбора элемента разбиения Х можно использовать:

1. Первый элемент последовательности.

2. Последний элемент последовательности.

3. Элемент находящийся посередине последовательности.

4. Медиану последовательности.

5. Медиану среди элементов (а 1, a n/2, a n).

6. Генератор случайных чисел.

Для алгоритма быстрой сортировки имеем следующие выводы:

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

2. лучший выбор элемента разделения – медиана последовательности;

3. быстрая сортировка работает наихудшим образом для полностью отсортированных последовательностей при выборе в качестве элемента разбиения наименьшего (наибольшего) значения;

4. в среднем (по всем последовательностям размера n) быстрая сортировка имеет сложность O (n · log 2 n);

5. в наихудшем случае быстрая сортировка имеет сложность O (n 2);

6. быстрая сортировка является одним из наилучших алгоритмов сортировки (за счет наименьшей мультипликативной константы C Q по сравнению с пирамидальной сортировкой).

Пример. Пошаговая работа алгоритма быстрой сортировки (первое разделение последовательности).

 

X=a(lb) // X - элемент разделения, для него ищется место окончательной позиции

Up=rb // Up – правая граница массива

Down=lb // Down – левая граница массива

While Down< Up do

While a(Down) <= X do

Down= Down+1

End

While a(Up) > X do

Up= Up-1

End

If Down< Up then

поменять местами a(Down) и a(Up)

End If

End

a(lb)= a(Up) // a(Up) меняется местами с a(lb)= X

a(Up)= X

j= Up // j – окончательная позиция элемента разделения X

Пусть имеется массив размерности n=9:

                 
                 

 

Проверим условие алгоритма: при движении слева-направо – "<=", справа-налево – ">".

X=a(1)=11

Up=n=9

Down=1

a(1)=11<=X=11 Да → Down= Down +1=2

a(2)=7<=X=11 Да → Down= Down +1=3

a(3)=2<=X=11 Да → Down= Down +1=4

a(4)=4<=X=11 Да → Down= Down +1=5

a(5)=18<=X=11 Нет → a(9)=11>X=11 → Нет

Down=5< Up=9 Да → обмен a(5) и a(9)

Получили 11, 7, 2, 4, 11, 9, 49, 5, 18

a(5)=11<=X=11 Да → Down= Down +1=6

a(6)=9<=X=11 Да → Down= Down +1=7

a(7)=49<=X=11 Нет → a(9)=18>X=11 Да → Up= Up-1=8

a(8)=5>X=11 Нет

Down=7< Up =8 Да → обмен a(7)=49 и a(8)=5

Получили 11, 7, 2, 4, 11, 9, 5, 49, 18

a(7)=5<=X=11 Да → Down= Down +1=8

a(8)=49<=X=11 Нет → a(8)=49>X=11 Да→ Up= Up-1=7

a(7)=5>X=11 Нет

Down=8< Up =7 Нет → обмен X=a(1)=11 с a(7)=5

После первого разделения получили последовательность вида:

                 
                 

 

Элемент разделения X=a(1)=11 занял окончательное место j=7 в почти что отсортированной последовательности, исходная последовательность разделилась на две части – первая с элементами <= X=11 – (5, 7, 2, 4, 11, 9, 11), вторая – с элементами > X=11 – (49, 18).

 

Список литературы

 

1. Лэнгсам И., Огенстайн М., Тененбаум А. Структуры данных для персональных ЭВМ. -М.: Мир, 1989.-568 с.(с.437-465).

2. Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы: построение и анализ. -М.: МЦНМО, 2000. - 960 с. (с. 175 – 177, с.171 – 173)

3. Седжвик Р. Фундаментальные алгоритмы на С++. Анализ/Структуры данных/Сортировка/Поиск. - К.: ДиаСофт, 2001. – 688 с. (с. 295-298, 401 - 437)

4. Ахо А., Хопкрофт Дж., Ульман Д. Структуры данных и алгоритмы. -М.: Вильямс, 2000. – 384 с. (с. 247 - 254)

5. Проценко В.С. та ін. Техніка програмування мовою Сі: Навч. Посібник,-К.:Либідь, 1993.-224 с.(с.72-73).

6. Мейер Б., Бодуэн К. Методы программирования Т.2.-М.:Мир, 1982.-368 с.(с.153-183).

7. Зубов В.С. Справочник программиста. Базовые методы решения графовых задач и сортировки.-М.: Филинъ, 1999.-256 с.(с.55-62).

8. Кнут Д. Искусство программирования для ЭВМ. Т.3. Сортировка и поиск.-М.:Мир, 1978.-844 с.(с.140-151,177-190).

9. Гудман С., Хидетниеми С. Введение в разработку и анализ алгоритмов.-М.:Мир, 1981.-(с.223-240).

 

Контрольные вопросы и задания

 

1. В чем состоят задача и цель сортировки?

2. Приведите классификацию алгоритмов внутренней сортировки.

3. Каковы основные показатели качества исследуемых алгоритмов сортировки?

4. Отсортируйте пошагово по возрастанию массив целых чисел размерности 6 с помощью быстрой сортировки, сортировки подсчетом, поразрядной сортировки (LSD и MSD).

5. Каковы сложности алгоритмов быстрой сортировки, сортировки подсчетом, поразрядной сортировки?

6. Как задается качество массива для исследования алгоритмов сортировки?







Дата добавления: 2015-10-02; просмотров: 398. Нарушение авторских прав; Мы поможем в написании вашей работы!



Функция спроса населения на данный товар Функция спроса населения на данный товар: Qd=7-Р. Функция предложения: Qs= -5+2Р,где...

Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...

Вычисление основной дактилоскопической формулы Вычислением основной дактоформулы обычно занимается следователь. Для этого все десять пальцев разбиваются на пять пар...

Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...

Весы настольные циферблатные Весы настольные циферблатные РН-10Ц13 (рис.3.1) выпускаются с наибольшими пределами взвешивания 2...

Хронометражно-табличная методика определения суточного расхода энергии студента Цель: познакомиться с хронометражно-табличным методом опреде­ления суточного расхода энергии...

ОЧАГОВЫЕ ТЕНИ В ЛЕГКОМ Очаговыми легочными инфильтратами проявляют себя различные по этиологии заболевания, в основе которых лежит бронхо-нодулярный процесс, который при рентгенологическом исследовании дает очагового характера тень, размерами не более 1 см в диаметре...

Медицинская документация родильного дома Учетные формы родильного дома № 111/у Индивидуальная карта беременной и родильницы № 113/у Обменная карта родильного дома...

Основные разделы работы участкового врача-педиатра Ведущей фигурой в организации внебольничной помощи детям является участковый врач-педиатр детской городской поликлиники...

Ученые, внесшие большой вклад в развитие науки биологии Краткая история развития биологии. Чарльз Дарвин (1809 -1882)- основной труд « О происхождении видов путем естественного отбора или Сохранение благоприятствующих пород в борьбе за жизнь»...

Studopedia.info - Студопедия - 2014-2024 год . (0.008 сек.) русская версия | украинская версия