Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗадачникПоТПиРнаЭВМ.doc
Скачиваний:
28
Добавлен:
11.03.2016
Размер:
1 Mб
Скачать

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

Алгоритм сортировки выбором состоит из трех шагов:

  1. Находится номер минимального значения в текущем списке.

  2. Производится обмен этого значения со значением первой, не отсортированной позиции (обмен не нужен, если минимальный элемент уже находится на данной позиции).

  3. Сортируется «хвост» списка, исключив из рассмотрения уже отсортированные элементы.

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

Листинг 5.3. Задан список студентов с указанием фамилии и номера группы (рис. 5.3). Упорядочить этот список по возрастанию номера группы, а внутри группы построить его в алфавитном порядке.

//L5_3.cpp

#include <string.h>

#include <iostream>

using namespace std;

int main()

{

setlocale(LC_CTYPE,"russian");

int n, i, j, *grup, jmax, gm;

char **name, fam[30], *fm;

fstream ff("input.txt");

ff>>n;

name=new char*[n]; //Выделение памяти для указателей, связанных

//с фамилией студентов.

grup=new int[n]; //Выделение памяти под номера групп

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

{

ff>>fam>>grup[i];

name[i]=strdup(fam); //Заполняется фамилия i-го студента

}

ff.close();

for(i=0;i<n-1;i++)

{

fm=name[i];

gm=grup[i];

jmax=i;

for(j=i+1;j<n;j++)

if(grup[j]<gm ||(grup[j]==gm && strcmp(name[j],fm)<0))

{

fm=name[j];

gm=grup[j];

jmax=j;

}

name[jmax]=name[i];

name[i]=fm;

grup[jmax]=grup[i];

grup[i]=gm;

}

cout<<"Полученный список\n";

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

{

cout.width(6); //Выделение поля для вывода группы

cout<<grup[i]<<" ";

cout<<name[i]<<'\n';

}

ff.open("input.txt", ios::app);

ff<<"\nПолученный список\n";

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

{

ff.width(6);

ff<<grup[i]<<" ";

ff<<name[i]<<'\n';

}

ff.close();

cin.get();

return 0;

}

Содержимое файла “input.txt

Рис. 5.3. Информация, находящаяся в файле «input.txt»

Результат работы программы листинга 5.3 приведен на рис. 5.4:

Рис. 5.4. Результат работы программы листинга 5­.3

5.4. Быстрая сортировка

Быстрая сортировка, хоть и была разработана более 40 лет назад, является наиболее широко применяемым и одним их самых эффективных алгоритмов сортировки. Метод основан на принципе «разделяй-и-властвуй».

Общая схема быстрой сортировки такова: из массива выбирается некоторый опорный элемент a[i], запускается процедура разделения массива, которая перемещает все ключи, меньшие, либо равные a[i], влево от него, а все ключи, большие, либо равные a[i] – вправо (рис. 5.5). Теперь массив состоит из двух подмножеств, причем левое подмножество меньше, либо равно правого:

Рис. 5.5. Разделение массива на два подмассива

Для каждого подмассива будем иметь: если в подмассиве более двух элементов, рекурсивно запускается для него та же процедура. В конце получится полностью отсортированная последовательность.

Рассмотрим алгоритм быстрой сортировки подробнее.

  1. На входе задаем массив a[0] ... a[N] и опорный элемент p, по которому будет производиться разделение.

  2. Введем два указателя: i и j (рис. 5.6). В начале алгоритма они указывают, соответственно, на левый и правый концы последовательности.

  3. Будем двигать указатель i с шагом в 1 элемент по направлению к концу массива, пока не будет найден элемент a[i] >= p.

  4. Аналогичным образом начнем двигать указатель j от конца массива к началу, пока не будет найден a[j] <= p.

  5. Если i <= j, меняем a[i] и a[j] местами и продолжаем двигать i, j по тем же правилам.

  6. Повторяем шаг 3, пока i <= j.

Рассмотрим работу процедуры быстрой сортировки для массива a[0]...a[6] и опорного элемента p = a[3] (рис. 5.6).

Рис. 5.6. Иллюстрация алгоритма быстрой сортировки

Теперь массив разделен на две части: все элементы левой меньше либо равны p, все элементы правой – больше, либо равны p. Разделение завершено.

Листинг 5.4. Задать исходный массив х[N]. Количество элементов массива N и значения элементов массива ввести с клавиатуры. Применяя алгоритм быстрой сортировки, отсортировать исходный массив в порядке возрастания его элементов. Вывести на экран дисплея исходный и отсортированный массивы.

//L5_4.cpp

#include <iostream>

using namespace std;

void qs(int* s_arr, int first, int last); // Прототип функции qs()

int main()

{

setlocale(LC_CTYPE,"russian");

int i, n, *x;

do

{

cout<<"Введите число элементов массива ";

cin>>n;

}while (n<=1);

x=new int[n];

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

{

cout<<"Введите x("<<i+1<<")=";

cin>>x[i];

}

cout<<"Исходный массив\n";

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

cout<<x[i]<<" ";

cout<<endl;

qs(x,0,n-1);

cout<<"Полученный массив\n";

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

cout<<x[i]<<" ";

cout<<endl;

return 0;

}

void qs(int* s_arr, int first, int last)

{

int i = first, j = last, x = s_arr[(first + last) / 2];

do {

while (s_arr[i] < x) i++;

while (s_arr[j] > x) j--;

if(i <= j) {

if (i < j) swap(s_arr[i], s_arr[j]);

i++;

j--;

}

} while (i <= j);

if (i < last)

qs(s_arr, i, last);

if (first < j)

qs(s_arr, first, j);

}

На рис. 5.7 приведен результат выполнения программы листинга 5.4.

Рис. 5.7. Результат работы программы листинга 5.4

Упражнения

  1. Упорядочить массив из n числовых элементов методом пузырька по возрастанию.

  2. Упорядочить массив из n числовых элементов методом пузырька по убыванию.

  3. Используя алгоритм быстрой сортировки, упорядочить массив из n числовых элементов по убыванию.

  4. Используя алгоритм сортировки вставкой, упорядочить массив из n числовых элементов по убыванию.

  5. Используя алгоритм сортировки выбором, упорядочить массив из n числовых элементов по убыванию.

  6. Используя алгоритм сортировки выбором, упорядочить массив из n числовых элементов по возрастанию.

  7. Упорядочить четные элементы массива из n числовых элементов методом пузырька по возрастанию.

  8. Упорядочить нечетные элементы массива из n числовых элементов методом пузырька по убыванию.

  9. Упорядочить массив из n символов методом пузырька в алфавитном порядке.

  10. Упорядочить массив из n символов методом быстрой сортировки в алфавитном порядке.

  11. Упорядочить массив из n символов методом сортировки вставкой в алфавитном порядке.

  12. Упорядочить массив из n числовых элементов методом пузырька по возрастанию числа их делителей.

  13. Используя алгоритм быстрой сортировки, упорядочить массив из n числовых элементов по убыванию числа их делителей.

  14. Используя алгоритм быстрой сортировки, упорядочить массив из n числовых элементов по возрастанию числа их делителей.

  15. Задан список студентов с указанием их среднего балла за текущую сессию. Упорядочить список студентов по убыванию балла, а в случае равенства баллов, упорядочить список студентов в алфавитном порядке.

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

  17. Задан список сотрудников с указанием отдела, в котором они работают. Упорядочить список сотрудников по убыванию номера отдела, а в случае равенства номеров отделов, упорядочить его в алфавитном порядке.

  18. Упорядочить массив из n элементов следующим образом: положительные элементы по возрастанию, а отрицательные – по убыванию.

  19. Заданы два упорядоченных массива из n и m элементов. Построить массив размерностью n+m с той же упорядоченностью.

  20. Заданы два упорядоченных массива из n и m элементов. Построить массив размерностью n+m с противоположной упорядоченностью.

  21. Упорядочить массив из n элементов следующим образом: сначала положительные элементы по убыванию, а затем отрицательные элементы по возрастанию.

  22. Задан список финалистов лыжного соревнования с указанием фамилии и результата в минутах. Упорядочить список по возрастанию результатов, а в случае равенства результатов, указать фамилии спортсменов в алфавитном порядке.

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

  24. В налоговой инспекции составлен список налогоплательщиков с указанием фамилии и суммы задолженности по налогам. Упорядочить список налогоплательщиков по возрастанию суммы, а в случае равенства сумм указать фамилии налогоплательщиков в алфавитном порядке.

  25. Задан список сотрудников некоторой фирмы с указанием фамилии и суммы, заработанной за месяц. Упорядочить список сотрудников по убыванию заработанной суммы, а в случае равенства сумм упорядочить фамилии сотрудников в алфавитном порядке.