Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекций по Программированию на С++.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
795.65 Кб
Скачать

Сортировка массива методом выбора

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

Рассмотрим программу, которая сортирует по возрастанию целочисленный массив методом выбора. Алгоритм состоит в том, что выбирается наименьший элемент массива и меняется местами с первым элементом, затем рассматриваются элементы, начиная со второго, и наименьший из них меняется местами со вторым элементом, и так далее n-1 раз (при последнем проходе цикла при необходимости меняются местами предпоследний и последний элементы массива).

int main() {

const int N=5; // кол-во элементов массива

int b[N], i;

cout << "Vvedite " << N << " elementov massiva: " << endl;

for(i=0; i<N; i++) cin >> b[i];

for(i=0; i<N-1; i++) { //цикл сортировки массива

int imin = i; //принимаем за наименьший первый из элементов

for(int j=i+1; j<N; j++)

if(b[j] < b[imin]) imin = j; // поиск минимального

int a = b[i]; //обмен местами:

b[i] = b[imin];

b[imin] = a;

}

cout << "Otsortirovannyi massiv: ";

for(i=0; i<N; i++) cout << b[i] << " ";

getch(); return 0;

}

Рассмотрим в деталях ход выполнения программы. Пусть мы ввели следующие элементы массива:

2

5

3

4

1

b[0]

b[1]

b[2]

b[3]

b[4]

Первый шаг: i=0; imin=0; j=1; b[1]<b[0] ложь;

j=2; b[2]<b[0] ложь;

j=3; b[3]<b[0] ложь;

j=4; b[4]<b[0] imin=4 => a=b[0]; b[0]=b[4]; b[4]=a Поменяли местами 0-ой и 4-ый, в результате имеем:

1

5

3

4

2

b[0]

b[1]

b[2]

b[3]

b[4]

Второй шаг: i=1; imin=1; j=2; b[2]<b[1] imin=2;

j=3; b[3]<b[2] ложь;

j=4; b[4]<b[2] imin=4; => a=b[1]; b[1]=b[4]; b[4]=a

Поменяли местами 1-ый и 4-ый, в результате имеем: 1 2 3 4 5. И т.д.

Как вы думаете, что необходимо изменить в данной программе, чтобы сортировка производилась по убыванию? Ответ: if(b[j] > b[imin]) imin = j; .

Сортировка массива методом пузырька

Рассмотрим программу сортировки по возрастанию элементов целочисленного массива методом пузырька.

int main() {

const int N=5;

int i, b[N];

cout << "Vvedite " << N << " elementov massiva:" << endl;

for(i=0; i<N; i++) cin >> b[i];

for(i=0; i<N-1; i++) { //цикл сортировки элементов массива

for(int j=i+1; j<N; j++) {

if(b[j] < b[i]) { int a = b[i]; b[i] = b[j]; b[j] = a; }

}

}

cout << "Otsort. massiv: ";

for(i=0; i<N; i++) cout << b[i] << " ";

getch(); return 0;

}

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

Д/З

Напишите программу, которая ищет и выводит минимальный элемент введённого с клавиатуры массива целых чисел.

Ответ

int main() {

const int N=5;

int i, i_min, arr[N];

cout << "Vvedite " << N << " elementov massiva: " << endl;

for(i=0; i<N; i++) cin >> arr[i];

i_min = 0; // предположим, что 1-ый элемент минимальный

for(i=1; i<N; i++) {

if(arr[i] < arr[i_min]) i_min = i;

}

cout << "Min. element massiva: " << arr[i_min];

getch(); return 0;

}