
Подготовительная программа
#include <iostream.h>
#include <stdlib.h>
template <class Item>
void exch(Item &A, Item &B)
{Item t = A; A = В; В = t;}
template <class Item>
void compexch (Item &A, Item &B)
{if (B < A) exch(A, B);}
template <class Item>
void sort (Itern a[] , int m, int r)
{ for (int i = m+1; i <= r; i++)
for (int j = i; j > m; j--)
compexch(a[j-1], a[j]);
}
6.2. Сортировка выбором
Один из самых простых алгоритмов сортировки работает следующим образом. Сначала отыскивается наименьший элемент массива, затем он меняется местами с элементом, стоящим первым в сортируемом массиве. Далее, находится второй наименьший элемент и меняется местами с элементом, стоящим вторым в исходном массиве. Этот процесс продолжается до тех пор, пока весь массив не будет отсортирован. Изложенный метод называется сортировкой выбором, поскольку он работает по принципу выбора наименьшего элемента из числа неотсортированных. На рис 6.2. представлен пример работы этого метода.
A |
S |
O |
R |
T |
I |
N |
G |
E |
X |
A |
M |
P |
L |
E |
РИСУНОК 6.2. ПРИМЕР СОРТИРОВКИ ВЫБОРОМ В этом примере первый проход не дал результата, поскольку слева от A в массиве нет элемента, меньшего А. На втором проходе другой элемент А оказался наименьшим среди оставшихся, поэтому он меняется местами с элементом S, занимающим вторую позицию. Далее, на третьем проходе, элемент Е, находящийся в середине массива, меняется местами с О, занимающим третью позицию; затем, на четвертом проходе, еще один элемент Е меняется местами с R, занимающим четвертую позицию и т. д. |
A |
S |
O |
R |
T |
I |
N |
G |
E |
X |
A |
M |
P |
L |
E |
|
A |
A |
O |
R |
T |
I |
N |
G |
E |
X |
S |
M |
P |
L |
E |
|
A |
A |
E |
R |
T |
I |
N |
G |
O |
X |
S |
M |
P |
L |
E |
|
A |
A |
E |
E |
T |
I |
N |
G |
O |
X |
S |
M |
P |
L |
R |
|
A |
A |
E |
E |
G |
I |
N |
T |
O |
X |
S |
M |
P |
L |
R |
|
A |
A |
E |
E |
G |
I |
N |
T |
O |
X |
S |
M |
P |
L |
R |
|
A |
A |
E |
E |
G |
I |
L |
T |
O |
X |
S |
M |
P |
N |
R |
|
A |
A |
E |
E |
G |
I |
L |
M |
O |
X |
S |
T |
P |
N |
R |
|
A |
A |
E |
E |
G |
I |
L |
M |
N |
X |
S |
T |
P |
O |
R |
|
A |
A |
E |
E |
G |
I |
L |
M |
N |
O |
S |
T |
P |
X |
R |
|
A |
A |
E |
E |
G |
I |
L |
M |
N |
O |
P |
T |
S |
X |
R |
|
A |
A |
E |
E |
G |
I |
L |
M |
N |
O |
P |
R |
S |
X |
T |
|
A |
A |
E |
E |
G |
I |
L |
M |
N |
O |
P |
R |
S |
X |
T |
|
A |
A |
E |
E |
G |
I |
L |
M |
N |
O |
P |
R |
S |
T |
X |
|
A |
A |
E |
E |
G |
I |
L |
M |
N |
O |
P |
R |
S |
T |
X |
Программа 6.2 – суть реализация сортировки выбором, в которой выдержаны все принятые нами соглашения. Внутренний цикл представляет собой сравнение текущего элемента с наименьшим из выявленных к тому времени элементом (плюс программный код, необходимый для увеличения на единицу индекса текущего элемента и проверки того, что он не выходит за границы массива); трудно себе представить более простой метод сортировки. Действия по перемещению элементов выходят за пределы внутреннего цикла: каждая операция обмена элементов местами устанавливает один из них в окончательную позицию, так что всего потребуется выполнить N–1 таких операций (для последнего элемента эту операцию выполнять не нужно). Таким образом, основную составляющую времени выполнения сортировки представляет количество осуществленных операций сравнения. В разделе 6.5 будет показано, что это время пропорционально N2, а также представлены способы вычисления общего времени выполнения программы сортировки и корректного сравнения сортировки выбором и других элементарных методов.
Программа 6.2. Сортировка выбором
Для каждого i от m до r–1 поменять местами элемент a[i] с минимальным элементом в последовательности a[i],...,a[r],. По мере продвижения индекса i слева направо, элементы слева от него занимают свои окончательные позиции в массиве (дальнейшим перемещениям они не подлежат), таким образом, массив будет полностью отсортирован, когда i достигнет его правого конца.
template <class Item>
void selection (Item a[], int m, int r)
{ for (int i = m; i < r; i++)
{ int min = i;
for (int j = i+1; j <= r; j++)
if (a[j] < a[min]) min = j;
exch(a[i], a[min]);
}
}
Недостаток сортировки выбором заключается в том, что время ее выполнения лишь в малой степени зависит от того, насколько упорядочен исходный файл. Процесс нахождения минимального элемента за один проход файла дает очень мало сведений о том, где может находиться минимальный элемент на следующем проходе этого файла, Например, пользователь, применяющий этот метод, будет немало удивлен, когда узнает, что на сортировку почти отсортированного файла или файла, записи которого имеют одинаковые ключи, требуется столько же времени, сколько и на сортировку файла, упорядоченного случайным образом! Как мы убедимся позже, другие методы с большим успехом используют преимущества присутствия порядка в исходном файле.
Несмотря на всю ее простоту и очевидный примитивизм подхода, сортировка выбором превосходит более совершенные методы в одном из важных приложений: этому методу сортировки файлов отдается предпочтение в тех случаях, когда записи файла огромны, а ключи занимают незначительное пространство. В подобного рода приложениях затраты ресурсов на перемещения записей намного превосходят стоимость операций сравнения, а что касается перемещения данных, то никакой алгоритм не способен выполнить сортировку файла с меньшим числом перемещений данных, нежели метод выбора (см. лемму 6.5, раздел 6.5).