Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

Глава 11. Сортировка, наборы и выбор

Оперативный быстрый вид изменяет входную последовательность, используя обмен элемента и явно не создает подпоследовательности. Действительно, подпоследовательность входа se-айва неявно представлена диапазоном положений, определенных крайним левым индексом l и самым правым индексом r. Шаг дележа выполнен, просмотрев множество одновременно от l вперед и от r назад, обменяв пары монетных дворов ele-, которые находятся в обратном порядке как показано в рисунке 11.14. Когда эти два индекса «встречаются», подвекторы L и G находятся на противоположных сторонах места встречи. algo-rithm заканчивает, повторяясь на этих двух подвекторах.

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

(a)

(b)

(c)

(d)

(e)

(f)

(g)

Рисунок 11.14: Разделите шаг оперативного быстрого вида. Индекс l просматривает последовательность от

слева направо, и индекс r просматривает последовательность справа налево. Обмен выполнен, когда l в элементе, больше, чем центр и r в элементе, меньшем, чем центр. Заключительный обмен с центром заканчивает шаг дележа.

11.2. Быстрый вид 525

Мы показываем C ++ версия оперативного быстрого вида в Кодовом Фрагменте 11.7.

вход к процедуре сортировки - вектор STL элементов и объекта компаратора, который обеспечивает меньше функция. Наше внедрение - прямая адаптация Кодового Фрагмента 11.6. Главная процедура, quickSort, призывает рекурсивную процедуру quickSortStep, чтобы сделать большую часть работы.

шаблон <typename E, typename C> пустота quickSort (std::vector<E>& S, константа C& меньше)

если (S.size () <= 1) возвращение;

quickSortStep (S, 0, S.size ()-1, меньше);

шаблон <typename E, typename C>

//быстрый вид S

//уже сортированный

//назовите полезность вида

пустота quickSortStep (std::vector<E>& S, интервал a, интервал b, константа C& меньше)

если (a> = b) возвращение; //0 или 1 оставленный?договорились!

E центр = S [b]; //выбирают в последний раз как интервал центра l = a; //оставленный край

интервал r = b- 1; //правый край

в то время как (l <= r)

в то время как (l <= r &&! меньше (центр, S [l])) l ++;

в то время как (r> = l &&! меньше (S[r], центр)) r-;

если (l <r)

станд.:: обмен (S [l], S[r]);

станд.:: обмен (S [l], S [b]);

quickSortStep (S, a, l-1, меньше);

quickSortStep (S, l+1, b, меньше);

//просмотрите прямо, до больше//просмотр оставил до меньшим//оба элемента найденный

//до креста индексов//центр магазина в l//повторяются с обеих сторон

Кодовый Фрагмент 11.7: кодирование оперативного быстрого вида, принимая отличные элементы.

Функции quickSortStep дают индексы a и b, которые указывают на границы подвектора, который будет сортирован. Элемент центра выбран, чтобы быть последним элементом вектора. Индексы l и r отмечают левые и правые концы подвекторов

будучи обработанным в функции разделения. Они инициализированы к a и b- 1,

соответственно. Во время каждого раунда, элементы, которые находятся на неправильной стороне центра

обменяны друг с другом, пока эти маркеры не врезаются друг в друга.

Большая часть эффективности быстрого вида зависит от того, как центр выбран. Как мы видели, быстрый вид является самым эффективным, если центр около середины сортируемого подвектора. Наш выбор урегулирования центра к последнему элементу подвектора полагается при условии, что последний элемент - reflective среднего ключа valye. Лучший выбор, если подвектор умеренно измерен, состоит в том, чтобы выбрать центр как медиану трех ценностей, взятых соответственно с фронта, середина и хвост множества. Это упоминается как median-three эвристическое. Это имеет тенденцию выступать хорошо на практике и быстрее, чем отбор случайного центра с помощью генератора случайных чисел.

526

11.3