Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методички.C++ / Конспект Лекций - Части 1,2.pdf
Скачиваний:
277
Добавлен:
24.02.2016
Размер:
1.97 Mб
Скачать

все

все

конец цикла

После выполнения цикла номер элемента, равного .X хранится в переменной R. Если R=N-1, значит совпадения нет.

14.5. Сортировка выбором

Концепция упорядоченного множества элементов имеет существенное значение в разнообразных областях нашей жизни.

В общем, сортировку (упорядочение) следует понимать как процесс перегруппировки (перераспределения) заданного множества объектов в некотором определенном порядке. Основная цель сортировки – облегчить поиск элементов в таком упорядоченном множестве.

Мы встречаемся с упорядоченными объектами на складах, в телефонных справочниках, в библиотечных каталогах, в словарях, т.е. почти везде, где нужно осуществлять поиск в массивах объектов.

Задачу сортировки формулирую так. Пусть надо упорядочить N элементов

a1, a2, ... , an,

которые назовем объектами. Каждый объект ai имеет свой ключ kI, который и управляет процессом сортировки

Задача сортировки – найти такую перестановку объектов p(1)p(2)...р(n), после которой ключи объектов расположились бы например так:

Кр(1) Кр(2) ... Кр(n).

Порядок, при котором в массиве объектов первым элементом является объект с наименьшим ключом, а каждое следующее значение больше предыдущего, и наконец последнее – самое большое из данного массива называют возрастаю-

щим.

Примером задачи сортировки может служить следующая формулировка.

В массиве из N различных целых чисел осуществить их перестановку так, чтобы после перестановки в массиве первым элементом было самое большое число. Каждое следующее должно быть меньше предыдущего, и последнее – наименьшее из чисел массива. Такой порядок расположения чисел называют убы-

вающим.

Сортировка – хороший пример комплекса задач, которые решают при помощи большой совокупности разнообразных алгоритмов. Каждый из алгоритмов имеет и свои достоинства, и свои недостатки. Выбирать конкретный алгоритм рекомендуется исходя из конкретной постановки задачи.

Выбранный метод сортировки должен экономно использовать оперативную память компьютера. А это значит, что перестановки, приводящие элементы в требуемый порядок, должны выполняться по возможности на том же участке

200

памяти. Поэтому методы, в которых элементы из массива a пересылаются в результирующий массив b используют только в исключительных случаях.

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

Таким образом, основное требование к методам сортировки – экономное использование времени процессора и памяти. Например, хорошими алгоритмами считаются те, которые затрачивают на сортировку N объектов время порядка

N*log2(N).

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

Обычно сортировку подразделяют на два класса: внутреннюю, когда все объекты хранятся в оперативной памяти, и внешнюю, когда они там все не помещаются. Мы рассмотрим только внутреннюю сортировку.

Существующие методы сортировки обычно разбивают на три класса, в зависимости от лежащего в их основе приема:

а) сортировка выбором; б) сортировка обменами;

в) сортировка включениями (вставками).

Рассмотрим основные алгоритмы сортировки на примере целочисленного массива.

14.6. Алгоритмы сортировки выбором

Метод 1. Простой линейный выбор

Метод предполагает использование рабочего (дополнительного) массива, в который в конечном итоге помещается отсортированный массив. Количество просмотров определяется количеством элементов массива. Сортировка посредством простого линейного выбора сводится к следующему:

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

2.Повторить шаг 1. На этот раз будет выбран наименьший (наибольший) из оставшихся элементов.

3.Повторять шаг 1 до тех пор, пока не будут выбраны все N элементов. Программа, реализующая алгоритм простого линейного выбора может быть

следующей:

#include <iostream.h> #include <conio.h> #include <limits.h>

// Файл с декларацией max(min) целого: INT_MAX (INT_MIN)

201

void Sort_Lin(int *, int); void main(void)

{

int *a, n, i;

cout << " \n Input N: "; cin >> n;

a = new int [n]; // Захватываем память для основного массива cout << " \n Array ? "<<endl;

//Формируем исходный массив for ( i=0; i<n; i++)

{

cout<<"a["<<i<<"]="; cin >> a[i];

}

Sort_Lin ( a, n ); // Вызвали сортировку

//и распечатали отсортированный массив cout << " \n Sort Array : ";

for ( i=0; i<n; i++) cout << a[i] << " "; cout << endl;

delete [ ]a; getch();

}

//----Функция, реализующая простой линейный выбор ------

void Sort_Lin(int *a, int n)

{

int i, j, imn, amin, *p;

p = new int [n]; // Захватываем память для рабочего массива for ( j=0; j<n; j++) // Внешний цикл по j

{

for ( amin=INT_MAX, i=0; i<n; i++) // Внутренний цикл по i if ( a[i] < amin )

{

imin = i; amin = a[i];

}

p[j] = amin; // Найденный текущий min в рабочий массив

a[imin] = INT_MAX; // а на его место max_допустимое целое

}

for ( j=0; j<n; j++)

a[j] = p[j]; // Отсортированный массив на место исходного delete [ ]p;

}

В результате получим:

Input N: 5 Array ?

202

a[0]=4

a[1]=1

a[2]=8

a[3]=5

a[4]=3

Sort Array : 1 3 4 5 8 Press any key to continue

Здесь, внешний цикл по j осуществляет формирование рабочего отсортированного массива. последовательно укорачивая исходный массив записывая на место текущего максимально допустимое целочисленное значение INT_MAX., А внутренний цикл по i осуществляет поиск min (и определяет его порядковый номер imin) в текущей рабочей части массива, который будет максимальным по отношению к уже сформированной по возрастанию части рабочего массива.

После выхода из внешнего цикла все элементы исходного массива a имеют значение равное INT_MAX. Поэтому последний цикл переписывает отсортированные значения рабочего массива в исходный, после чего рабочий массив уничтожаем.

Метод 2. Линейный выбор с обменом (сортировка выбором)

Рабочий массив здесь не используется.

Рассмотрим принципы, на которых основан этот метод сортировки. Например, нужно отсортировать массив по убыванию.

1.Выбирается максимальный элемент.

2.Он меняется местами с первым элементом a[1]. На первом месте оказывается максимальный элемент.

3.Дальше рассматривается только не отсортированная часть массива, и этот процесс повторяется с оставшимися N-1, N-2 элементами и т. д. до тех пор, пока не останется один, наименьший элемент.

Рассмотрим работу данного метода на примере целочисленного массива a={0, 1, 9, 2, 4, 3, 6, 5}.

Максимальный элемент на текущем шаге подчеркиваем, а рабочую часть отделять вертикальной линией. Итак:

1)│ 0, 1, 9, 2, 4, 3, 6, 5 ─ выбрали, поменяли с первым (с 1-м)

2)

9, │ 1, 0, 2, 4, 3, 6, 5

─ выбрали, поменяли с первым оставшейся части

массива

 

 

3)

9, 6, │ 0, 2, 4, 3, 1, 5

─ и т.д

4)9, 6, 5, │ 2, 4, 3, 1, 0

5)9, 6, 5, 4, │ 2, 3, 1, 0

6)9, 6, 5, 4, 3, 2, │ 1, 0

7)9, 6, 5, 4, 3, 2, 1, │ 0

8)9, 6, 5, 4, 3, 2, 1, 0

Подсчитаем количество сравнений, которые пришлось сделать для упорядочения массива.

203

Соседние файлы в папке методички.C++