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

5.3 Быстрая обменная сортировка

В предыдущем разделе мы видели два алгоритма сортировки: обменную и слиянием. Один из них работал быстро, а другой — экономно, т.е. не требовал памяти помимо сортируемого массива.

К. Хоор (C. Hoare) предложил алгоритм, который работает так же быстро, как сортировка слиянием и так же экономно, как обменная сортировка. Он был назван быстрой обменной сортировкой или сортировкой Хоора.

Суть алгоритма в том, что мы наудачу выбираем одно из чисел сортируемого массива и назначаем его разделителем. Затем перестраиваем элементы массива так, что все числа меньшие разделителя располагаются до него, а все числа большие разделителя — после. Этот процесс называется частичной сортировкой, и вы увидите, что ее можно выполнить за один просмотр массива. Далее таким же образом сортируем первую, а потом вторую часть массива.

Сначала займемся частичной сортировкой. Пусть задан массив M:

40 80 30 50 60 10 20

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

40 80 30 50 60 10 20

Поменяем их местами

40 20 30 50 60 10 80

и продолжим движение

40 20 30 50 60 10 80

Будем поступать аналогично,

40 20 30 10 60 50 80

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

40 20 30 10 60 50 80

Остается поменять число над правой отметкой (из двух отмеченных оно теперь левее!) местами с разделителем

10 20 30 40 60 50 80

и частичная сортировка закончена.

Оформим ее в виде процедуры с названием “ЧастСорт” и параметрами: Left — левая граница области сортировки, Right — правая граница области сортировки, Middle — место разделителя по окончании частичной сортировки.

Процедура ЧастСорт (Left, Right, Middle)

Начало

Выбрать место разделителя, Separ = Left;

Пока Left <= Right повторять Начало

Пока M[Left] <= M[Separ] повторять Left = Left+1;

Пока M[Right] >= M[Separ] повторять Right = Right + 1;

Если Left < Right, то

совершить обмен, M[Left]  M[Right];

Конец

Совершить обмен, M[Separ]  M[Right];

Установить новое положение разделителя, Middle = Right.

Конец

Теперь напишем рекурсивный алгоритм сортировки Хоора. В качестве параметров зададим границы сортируемой области.

Процедура Хоор (Left, Right)

Начало

Если в области сортировки больше одного элемента, Left < Right, то

Начало

Выполняем частичную сортировку, ЧастСорт(Left, Right, Middle),

после которой разделитель попадает в M[Middle];

Сортируем левую часть массива, Хоор (Left,Middle-1);

Сортируем правую часть массива,

Хоор (Middle+1, Right).

Конец

Конец

Как видите, алгоритм не только быстрый, не только экономный, но и простой. Этим объясняется его широкое практическое применение. Что касается сортировки слиянием, ее мы изучали не зря. Из трех сортировок она единственная пригодна для упорядочения не только массивов, но и файлов.

Вопросы

1. Какие алгоритмы называют рекурсивными ?

2. Что такое глубина рекурсии ?

3. Предложите рекурсивный алгоритм суммирования массива из n чисел. Оцените его глубину рекурсии.

4. Понятию “факториал числа” можно дать рекурсивное определение:

а) 0! = 1;

б) n! = (n-1)! * n, если n > 0.

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

5. Оцените временную сложность алгоритма Ханой для пирамиды из n дисков.

6. Оцените временную сложность быстрой обменной сортировки, предположив, что разделитель всегда попадает:

а) точно в середину сортируемой области;

б) в начало сортируемой области.

ОСНОВЫ ПРОГРАММИРОВАНИЯ НА С++

6 ВВЕДЕНИЕ В С++

6.1 Что такое С++

С++ — универсальный язык общего назначения, область приложения которого — программирование систем (больших программ). С++, вместе с С, не только самый распространенный язык программирования, но и общепринятый язык общения программистов.

С++ предложил Бьярн Страуструп примерно в 1980 г. С тех пор язык интенсивно развивается. Описание современного состояния языка можно найти в книге Б. Страуструпа “Язык программирования C++”.— Киев, 1993.

О языке системы программирования Borland C++ можно прочесть в книге Бруно Бабэ “Просто и ясно о Borland C++”, Москва, БИНОМ, 1995. Книга ориентирована на версию Borland C++ 4.0.

С++ включает язык С как подмножество, имеет строгую типизацию подобно Паскалю и средства объектно-ориентированного программирования.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]