
- •Часть 2. Основы программирования
- •Часть 2. Основы программирования
- •Содержание
- •Предисловие
- •Лабораторная работа 21 Подставляемые (встраиваемые) функции. Перегрузка функций
- •Лабораторная работа 22 Производные типы. Тип указатель: указатели на объекты
- •Лабораторная работа 23 Тип указатель: указатели на функции
- •Лабораторная работа 24 Решение задач с использованием указателей
- •Лабораторная работа 25 Символьные данные и строки
- •Лабораторная работа 26 Функции для работы со строками
- •Лабораторная работа 27 Решение задач на строки
- •Лабораторная работа 28 Массивы: одномерные массивы
- •Лабораторная работа 29 Одномерные массивы: задачи поиска, замены и перестановок элементов массива
- •Лабораторная работа 30 Одномерные массивы: задачи сортировок элементов массива
- •Лабораторная работа 31 Двумерные массивы. Задачи поиска, замены и суммирования элементов двумерного массива
- •Лабораторная работа 32 Двумерные массивы. Задачи сортировок и перестановок в двумерных массивах
- •Индивидуальные задания Требования к оформлению индивидуальных заданий
- •Задание 1. Указатели
- •Задание 2. Перегрузка функций
- •Задание 3. Строки
- •Задание 4. Одномерный массив: преобразование массива
- •Задание 5. Одномерный массив: сортировка массива
- •Задание 6. Двумерный массив
- •Литература
- •Часть 2. Основы программирования
Лабораторная работа 30 Одномерные массивы: задачи сортировок элементов массива
Цель работы: изучить алгоритмы простейших сортировок и научиться решать задачи на их применение в одномерных массивах в языке C++.
Теоретические сведения
Задача сортировки является такой же базовой, как задача поиска. В практических условиях эти задачи взаимосвязаны. Решению проблем, связанных с сортировкой, посвящено множество фундаментальных научных исследований, разработано множество алгоритмов.
В общем случае сортировку следует понимать как процесс перегруппировки, заданного множества объектов в определенном порядке.
Сортировка применяется для облегчения поиска элементов в упорядоченном множестве. Задача сортировки одна из фундаментных в программировании.
Сортировка – это процесс перегруппировки заданного множества объектов в некотором установленном порядке.
Сортировки массивов подразделяются по быстродействию. Существуют простые методы сортировок, которые требуют n*n сравнений, где n – количество элементов массива и быстрые сортировки, которые требуют n*ln(n) сравнений. Простые методы удобны для объяснения принципов сортировок, т. к. имеют простые и короткие алгоритмы. Усложненные методы требуют меньшего числа операций, но сами операции более сложные, поэтому для небольших массивов простые методы более эффективны.
Простые методы подразделяются на три основные категории:
сортировка методом «пузырька» (простого обмена);
сортировка методом простого выбора (простой перебор);
сортировка методом простого включения (сдвиг-вставка, вставками, вставка и сдвиг).
Сортировка методом «пузырька» (простого обмена)
Алгоритм попарного сравнения в литературе называют «методом пузырька», проводя аналогию с пузырьком, поднимающимся со дна бокала с газированной водой. По мере всплывания пузырек сталкивается с другими пузырьками и, сливаясь с ними, увеличивается в объеме. Чтобы аналогия стала очевидной, нужно считать, что элементы массива расположены вертикально друг над другом, и их нужно так упорядочить, чтобы увеличивались сверху вниз.
Алгоритм состоит в повторяющихся проходах по сортируемому массиву. За каждый проход элементы последовательно сравниваются попарно и, если порядок в паре неверный, выполняется обмен элементов. Проходы по массиву повторяются до тех пор, пока на очередном проходе не окажется, что обмены больше не нужны, что означает – массив отсортирован. При проходе алгоритма, элемент, стоящий не на своём месте, «всплывает» до нужной позиции.
/*Описание функции сортировки методом "пузырька" (простым обменом)*/
void BubbleSort (int k,int x[max]) {
int i,j,buf;
for (i=k-1;i>0;i--)
for (j=0;j<i;j++)
if (x[j]>x[j+1]) {
buf=x[j];
x[j]=x[j+1];
x[j+1]=buf;
}
}
Сортировка методом простого выбора (простой перебор)
Это наиболее естественный алгоритм упорядочивания.
Шаги алгоритма:
находим минимальное значение в текущем списке
производим обмен этого значения со значением на первой неотсортированной позиции
теперь сортируем хвост списка, исключив из рассмотрения уже отсортированные элементы
//Описание функции сортировки методом простого выбора
void SelectionSort (int k,int x[max]) {
int i,j,min,temp;
for (i=0;i<k-1;i++) {
//устанавливаем начальное значение минимального индекса
min=i;
//находим минимальный индекс элемента
for (j=i+1;j<k;j++){
if (x[j]<x[min])
min=j;
//меняем значения местами
}
temp=x[i];
x[i]=x[min];
x[min]=temp;
}
}
Сортировка методом простого включения (сдвиг-вставка, вставками, вставка и сдвиг)
Хотя этот метод сортировки намного менее эффективен, чем более сложные алгоритмы (такие как быстрая сортировка), у него есть ряд преимуществ:
прост в реализации
эффективен на небольших наборах данных, на наборах данных до десятков элементов может оказаться лучшим
эффективен на наборах данных, которые уже частично отсортированы
это устойчивый алгоритм сортировки (не меняет порядок элементов, которые уже отсортированы)
может сортировать список по мере его получения
не требует временной памяти, даже под стек
На каждом шаге алгоритма мы выбираем один из элементов входных данных и вставляем его на нужную позицию в уже отсортированном списке, до тех пор пока набор входных данных не будет исчерпан. Метод выбора очередного элемента из исходного массива произволен; может использоваться практически любой алгоритм выбора.
//Описание функции сортировки методом простого включения
void InsertSort (int k,int x[max]) {
int i,j, temp;
for (i=0;i<k;i++) {
//цикл проходов, i - номер прохода
temp=x[i];
//поиск места элемента
for (j=i-1; j>=0 && x[j]>temp; j--)
x[j+1]=x[j];//сдвигаем элемент вправо, пока не дошли
//место найдено, вставить элемент
x[j+1]=temp;
}
}
Задания
Отсортируйте по возрастанию методом «пузырька» одномерный целочисленный массив, заданный случайными числами на промежутке [-100; 100). Выведите на экран исходный и отсортированный массивы.
Отсортируйте по возрастанию методом простого выбора одномерный вещественный массив, заданный случайными числами на промежутке [0; 50). Выведите на экран исходный и отсортированный массивы.
Отсортируйте по возрастанию методом простого включения одномерный целочисленный массив, заданный с клавиатуры. Выведите на экран исходный и отсортированный массивы.
Домашние задания
Отсортируйте по убыванию методом простого обмена одномерный целочисленный массив, заданный случайными числами на промежутке [-100; 100).
Отсортируйте по убыванию методом простого выбора одномерный вещественный массив, заданный случайными числами на промежутке [0; 50). Выведите на экран исходный и отсортированный массивы.
Отсортируйте по убыванию методом простого включения одномерный целочисленный массив, заданный с клавиатуры. Выведите на экран исходный и отсортированный массивы.
Индивидуальное задание. Номер варианта определяется по журналу. Напишите программу, оформив её в виде функций генерации, вывода и обработки массивов. Предусмотрите ввод количества элементов массива и ввод границ диапазона случайных чисел с клавиатуры. Для решения задания используйте «однопроходные» алгоритмы, позволяющие получить результат после однократного просмотра массива.
Варианты индивидуального задания
№ |
Задание |
|
Найти максимальный четный из данных n ненулевых целочисленных элементов массива. Если требуемые элементы отсутствуют, то вывести 0. |
|
Даны числа a, b (0 < a < b) и набор из n элементов. Найти минимальный из элементов, содержащихся в интервале (a, b). Если требуемые элементы отсутствуют, то вывести – 1. |
|
Дан массив А, состоящий из n элементов. Вывести номер первого и последнего из тех его элементов A[i], которые удовлетворяют двойному неравенству: A[1] < A[i] < A[n]. Если таких элементов нет, то вывести 0. |
|
Найти номер последнего максимального из массива данных n целочисленных элементов. |
|
Найти минимальный четный из данных n ненулевых целочисленных элементов массива. Если требуемые элементы отсутствуют, то вывести 0. |
|
Дан набор из n целочисленных элементов. Найти максимальное количество подряд идущих максимальных элементов. |
|
Дано вещественное число R и массив размера n. Найти два элемента массива, сумма которых наименее близка к данному числу R. |
|
Найти минимальный положительный из данных n элементов. Если требуемые элементы отсутствуют, то вывести 0. |
|
Дан целочисленный массив, состоящий из n элементов. Преобразовать его, прибавив к четным числам последний элемент. Начальный и последний элементы массива не изменять. |
|
Дан набор из n целочисленных элементов. Найти количество элементов, расположенных после последнего максимального. |
|
Дан набор из n целочисленных элементов. Найти количество элементов, содержащихся между первым и последним минимальным. Если в наборе имеется единственный минимальный элемент, то вывести 0. |
|
Дан целочисленный массив, состоящий из n элементов. Преобразовать его, прибавив к четным числам первый элемент. Начальный и последний элементы массива не изменять. |
|
Найти номер максимального отрицательного из данных n элементов. Если требуемые элементы отсутствуют, то вывести 0 |
|
Найти номера всех максимальных из массива данных n целочисленных элементов. |
|
Дан набор из n целочисленных элементов. Найти количество элементов, расположенных перед первым минимальным. |
|
Дан целочисленный массив, состоящий из n элементов. Преобразовать его, прибавив к нечетным числам первый элемент. Начальный и последний элементы массива не изменять. |
|
Найти количество минимальных и количество максимальных элементов в массиве из данных n целочисленных элементов. |
|
Дан целочисленный массив, состоящий из n элементов. Преобразовать его, умножив все положительные элементы на минимальный элемент. |
|
Найти минимальный нечетный из данных n ненулевых целочисленных элементов массива. Если требуемые элементы отсутствуют, то вывести 0. |
|
Дан целочисленный массив, состоящий из n элементов. Преобразовать его, разделив на 10 все элементы, оканчивающиеся хотя бы одним нулем. |
|
Найти максимальный нечетный из данных n ненулевых целочисленных элементов массива. Если требуемые элементы отсутствуют, то вывести 0. |
|
Дан целочисленный массив, состоящий из n элементов. Определите, есть ли в массиве элемент, равный среднему арифметическому всех элементов. |
|
Дан целочисленный массив, состоящий из n элементов. Замените нулевой элемент значением минимального, а последний – значением максимального элементов. |
|
Дан целочисленный массив, состоящий из n элементов. Преобразовать его, прибавив к нечетным числам последний элемент. Начальный и последний элементы массива не изменять. |
|
Дан набор из n целочисленных элементов. Найти количество элементов, содержащихся между первым и последним максимальным. Если в наборе имеется единственный максимальный элемент, то вывести 0. |
|
Дан целочисленный массив, состоящий из n элементов. Преобразовать его, умножив все его элементы на минимальный элемент. Минимальный элемент массива не изменять. |
|
Найдите максимальную разницу между соседними элементами вещественного массива. |
|
Замените единицами все простые элементы массива натуральных чисел. |