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

Лабораторная работа 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;

}

}

Сортировка методом простого выбора (простой перебор)

Это наиболее естественный алгоритм упорядочивания.

Шаги алгоритма:

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

  2. производим обмен этого значения со значением на первой неотсортированной позиции

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

//Описание функции сортировки методом простого выбора

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;

}

}

Задания

  1. Отсортируйте по возрастанию методом «пузырька» одномерный целочисленный массив, заданный случайными числами на промежутке [-100; 100). Выведите на экран исходный и отсортированный массивы.

  2. Отсортируйте по возрастанию методом простого выбора одномерный вещественный массив, заданный случайными числами на промежутке [0; 50). Выведите на экран исходный и отсортированный массивы.

  3. Отсортируйте по возрастанию методом простого включения одномерный целочисленный массив, заданный с клавиатуры. Выведите на экран исходный и отсортированный массивы.

Домашние задания

  1. Отсортируйте по убыванию методом простого обмена одномерный целочисленный массив, заданный случайными числами на промежутке [-100; 100).

  2. Отсортируйте по убыванию методом простого выбора одномерный вещественный массив, заданный случайными числами на промежутке [0; 50). Выведите на экран исходный и отсортированный массивы.

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

  4. Индивидуальное задание. Номер варианта определяется по журналу. Напишите программу, оформив её в виде функций генерации, вывода и обработки массивов. Предусмотрите ввод количества элементов массива и ввод границ диапазона случайных чисел с клавиатуры. Для решения задания используйте «однопроходные» алгоритмы, позволяющие получить результат после однократного просмотра массива.

Варианты индивидуального задания

Задание

Найти максимальный четный из данных n ненулевых целочисленных элементов массива. Если требуемые элементы отсутствуют, то вывести 0.

Даны числа ab (0 < a < b) и набор из n элементов. Найти минимальный из элементов, содержащихся в интервале (ab). Если требуемые элементы отсутствуют, то вывести – 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 элементов. Преобразовать его, умножив все его элементы на минимальный элемент. Минимальный элемент массива не изменять.

Найдите максимальную разницу между соседними элементами вещественного массива.

Замените единицами все простые элементы массива натуральных чисел.